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;
}