39求调
查看原帖
39求调
559101
clyCLY111楼主2024/5/26 16:41
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n,m,i,j,a[101][101],s[401],b[401],sum[401],id[401],t,ans,pre[101][101],k,x,l,r,res1,res2,f[401],g[101][101],ans1[101],ans2[101];
int find(int x){
    if(x==f[x]) return f[x];
    int root=find(f[x]);
    return f[x]=root;
}
void deal(int x,int y){
    f[find(x)]=find(y);
    return;
}
signed main(){
	cin>>n;
	for(i=1;i<=n;i++){
		while(cin>>x&&x!=0) a[i][x]=1;
		f[i]=i,f[i+n]=i+n;
	}
	for(i=1;i<n;i++){
		for(j=i+1;j<=n;j++){
			if(a[i][j]*a[j][i]==0){
				if(find(i)==find(j)){
					cout<<"No solution"<<endl;
					return 0;
				}
				deal(i,j+n),deal(j,i+n);
			}
		}
	}
	for(i=1;i<=n;i++){
		if(!b[find(i)]){
			id[++k]=i,b[find(i)]=1;
			for(j=1;j<=n;j++){
				if(find(i)==find(j)) sum[k]++;
			}
		}
	}
	g[0][0]=1;
	for(i=1;i<=k;i++){
		for(j=0;j<=n/2;j++){
			t=j-sum[i];
			if(t>=0&&g[i-1][t]) g[i][j]=1,pre[i][j]=1;
			t=j;
			if(g[i-1][t]) g[i][j]=1,pre[i][j]=0;
		}
	}
	for(i=n/2;i>=0;i--){
		if(g[k][i]){
			x=i;
			break;
		}
	}
	if(x==0){
		cout<<"No solution"<<endl;
		return 0;
	}
	for(i=k;i>=1;i--){
		if(pre[i][x]){
			x-=sum[i];
			for(j=1;j<=n;j++){
				if(find(id[i])==find(j)){
					ans1[++res1]=j;
				}
			}
		}
		else{
			for(j=1;j<=n;j++){
				if(find(id[i])==find(j)){
					ans2[++res2]=j;
				}
			}
		}
	}
	sort(ans1+1,ans1+1+res1),sort(ans2+1,ans2+1+res2);
	cout<<res1<<" ";
	for(i=1;i<=res1;i++) cout<<ans1[i]<<" ";
	cout<<endl<<res2<<" ";
	for(i=1;i<=res2;i++) cout<<ans2[i]<<" ";
	return 0;
}
2024/5/26 16:41
加载中...