15 UVA10982 Troublemakers

来源:互联网 发布:php 判断文件大小 编辑:程序博客网 时间:2024/05/16 17:45

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


0 0
原创粉丝点击