n个人,m对之间有关系,现在要把n个人分成两组,使得每组内,有关系的人的对数最少。
我们可以有一个贪心的想法,对于每一个人,我们要么分在第一组,要么分在第二组。
那么分在哪一组能够使得当前与我有关系的人最少,就分在哪一组。
这样求得答案,满足题目要求即输出相应内容。
#include<cstdio> #include<cstring> bool e[105][105]; int vis[105],T,n,m,i,j,x,y,cas=1,ans,cnt; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(e,0,sizeof e); for(i=0;i<m;i++) { scanf("%d%d",&x,&y); e[x][y]=e[y][x]=1; } memset(vis,-1,sizeof vis); vis[1]=0; for(i=2;i<=n;i++) { x=y=0; for(j=1;j<i;j++) { if(e[i][j]) { if(vis[j]==0) x++; else if(vis[j]==1) y++; } } if(x>y) vis[i]=1; else vis[i]=0; } ans=cnt=0; for(i=1;i<=n;i++) { if(vis[i]) cnt++; for(j=1;j<i;j++) if(e[i][j]&&vis[i]==vis[j]) ans++; } printf("Case #%d: ",cas++); if(ans<=m/2) { int f=0; printf("%d\n",cnt); for(i=1;i<=n;i++) { if(!vis[i]) continue; if(f) putchar(' '); else f=1; printf("%d",i); } } else puts("Impossible."); puts(""); } return 0; }
时间: 2024-10-19 13:57:57