WA60求助!!!
查看原帖
WA60求助!!!
709731
dreamnotfounddd楼主2024/8/18 15:11

#include<bits/stdc++.h>
#define f(i,j) f[i][j+4000]
typedef long long ll;
using namespace std;
const int maxn = 2007;
int n,g[maxn][maxn],hv[maxn],col[maxn],a[maxn][2],cnt=0,vis[maxn];
bool f[maxn][maxn*4];
void colorful(int u,int color,int id){
	col[u]=color;
	a[id][color]++;
	for(int v = 1;v<=n;v++){
		if(!g[u][v])continue;
		if(!vis[v]){
			if(col[v]==color){//同色且相邻则一定无解
				cout << "No solution\n";
				exit(0);
			}
			if(col[v]==-1)colorful(v,!color,id);//没有染色就去染
		}
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	memset(col,-1,sizeof col);
	for(int x,i = 1;i<=n;i++){//建反图
		memset(hv,0,sizeof hv);
		hv[i]=1;
		while(1){
			cin >> x;
			if(!x)break;
			hv[x]=1;
		}
		for(int j = 1;j<=n;j++){
			if(hv[j])continue;
			g[i][j]=g[j][i]=1;
		}
	}
	for(int i = 1;i<=n;i++)//染色
		if(col[i]==-1)
			colorful(i,0,++cnt);
	f(0,0)=1;
	for(int i = 1;i<=cnt;i++){//dp
		for(int j = -2000;j<=2000;j++){
			f(i,j)=f(i-1,j-a[cnt][1]+a[cnt][0])|f(i-1,j-a[cnt][0]+a[cnt][1]);
		}
	}
	int ans1,ans2;
	for(int i = 0;i<=2000;i++){//答案
		if(f(cnt,i) || f(cnt,-i)){
			ans1=min((n-i)/2,n-(n-i)/2),ans2=max((n-i)/2,n-(n-i)/2);
			cout << ans1 << " " << ans2 << "\n";
			return 0;
		}
	}
	cout << "Nos solution\n";
	return 0;
}
2024/8/18 15:11
加载中...