WA 求调 悬关
查看原帖
WA 求调 悬关
718487
CleverRaccoonʕ•ᴥ•ʔ楼主2023/8/6 13:04
#include <bits/stdc++.h>
using namespace std;
bool g[110][110],dp[110][110],ans[110],ret;
int T,n,color[110],cnt,num[110][4],res,get_color[110][110],pre[110][110];
vector<int> r[110][3];
void dfs(int i,int fa,int c){
	if(ret==1)return;
	color[i]=c;
	++num[cnt][c];
	r[cnt][c].push_back(i);
	for(int j=1;j<=n;j++)
		if(!g[i][j]&&i!=j&&j!=fa){
			if(!color[j])dfs(j,i,3-c);
			else if(color[j]==c){
				ret=1;
				return;
			}
		}
}
void run(){
	cin>>n;
	for(int i=1,tmp;i<=n;i++)
		while(cin>>tmp&&tmp!=0)
			g[i][tmp]=1;
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			if(g[i][j]!=g[j][i])
				g[i][j]=g[j][i]=0;
	for(int i=1;i<=n;i++)
		if(!color[i]){
			++cnt;
			dfs(i,0,1);
			if(ret==1)break;
		}
	if(ret==1){
		cout<<"No solution";
		return;
	}
	dp[0][0]=1;
	for(int i=1,a,b;i<=cnt;i++){
		a=num[i][1],b=num[i][2];
		for(int j=1;j<=n;j++){
			if(j>=a&&dp[i-1][j-a])dp[i][j]=1,get_color[i][j]=1,pre[i][j]=j-a;
			if(j>=b&&dp[i-1][j-b])dp[i][j]=1,get_color[i][j]=2,pre[i][j]=j-b;
		}
	}
	for(int i=n/2;i>=1;i--)
		if(dp[cnt][i]){
			res=i;
			break;
		}
	int i=cnt,j=res;
	while(i&&j){
		int c=get_color[i][j];
		for(int k=0;k<r[i][c].size();k++)ans[r[i][c][k]]=1;
		j=pre[i][j],i--;
	}
	cout<<res;
	if(ans[1])cout<<" "<<1;
	for(int i=1;i<=n;i++)
		if(ans[i])
			cout<<" "<<i;
	cout<<"\n"<<n-res;
	if(!ans[1])cout<<" "<<1;
	for(int i=1;i<=n;i++)
		if(!ans[i])
			cout<<" "<<i;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>T;
	while(T--){
		memset(g,0,sizeof g);
		memset(dp,0,sizeof dp);
		memset(ans,0,sizeof ans);
		memset(color,0,sizeof color);
		memset(num,0,sizeof num);
		memset(get_color,0,sizeof get_color);
		memset(pre,0,sizeof pre);
		for(int i=0;i<110;i++)
			for(int j=0;j<3;j++)
				r[i][j].clear();
		cnt=res=ret=0;
		run();
		if(T!=0)cout<<endl<<endl;
		else cout<<endl;
	}
	return 0;
}
2023/8/6 13:04
加载中...