div2 C 爆搜求调
  • 板块学术版
  • 楼主IYSY2009I
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/9/24 18:41
  • 上次更新2023/10/27 10:07:02
查看原帖
div2 C 爆搜求调
449457
IYSY2009I楼主2022/9/24 18:41

RT,实在找不出错误

#include<iostream>
#include<cstdio>
using namespace std;
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}
int n;
struct edge{
	int nxt;
	int to;
};
edge e[400005];
int h[200005];
int cnt;
void add(int x,int y){
	e[++cnt].to=y;
	e[cnt].nxt=h[x];
	h[x]=cnt;
	return;
}
int f[200005][19];
int dep[200005];
void dfs(int x,int fa){
    f[x][0]=fa;
    dep[x]=dep[fa]+1;
    for(int i=h[x];i;i=e[i].nxt)
        if(e[i].to!=fa) dfs(e[i].to,x);
	return;
}
void pre(){
    for(int j=1;j<=18;j++)
        for(int i=1;i<=n;i++)
            f[i][j]=f[f[i][j-1]][j-1];
	return;
}
int lca(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=18;i>=0;i--)
        if(dep[f[x][i]]>=dep[y]) x=f[x][i];
    if(x==y) return x;
    for(int i=19;i>=0;i--)
        if(f[x][i]!=f[y][i]){
            x=f[x][i];
            y=f[y][i];
        }
    return f[x][0];
}
int mp[25][25];
void q(int x,int y){
	int l=lca(x,y);
	int xx=x,yy=y;
	while(xx!=l){
		xx=f[xx][0];
		mp[x][y]=max(mp[x][y],xx);
	}
	while(yy!=l){
		yy=f[yy][0];
		mp[x][y]=max(mp[x][y],yy);
	}
	return;
}
int dp[1<<20];
bool vis[1<<20];
int solve(int x){
	if(vis[x]) return dp[x];
	int ans=0;
	for(int i=1;i<=n;i++){
		if(x&(1<<(i-1))) continue;
		for(int j=1;j<=n;j++){
			if((x&(1<<(j-1)))||j==i) continue;
			int k=mp[i][j];
			if(!(x&(1<<(k-1)))&&k!=i&&k!=j) ans=max(ans,solve(x^(1<<(i-1))^(1<<(j-1))^(1<<(k-1)))+1);
		}
	}
	dp[x]=ans;
	vis[x]=1;
	return ans;
}
void cf(){
	n=read();
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	pre();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j) q(i,j);
	printf("%d\n",solve(0));
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			mp[i][j]=0;
	for(int i=1;i<=18;i++)
		for(int j=1;j<=n;j++)
			f[j][i]=0;
	for(int i=1;i<=cnt;i++){
		e[i].nxt=0;
		e[i].to=0;
	}
	for(int i=1;i<=n;i++){
		h[i]=0;
		dep[i]=0;
	}
	for(int i=0;i<(1<<n);i++){
		dp[i]=0;
		vis[i]=0;
	}
	cnt=0;
	return;
}
int main(){
	int t=read();
	for(int i=1;i<=t;i++)
		cf();
	return 0;
}
2022/9/24 18:41
加载中...