hdu 5285 二分图+染色

来源:互联网 发布:手机象棋打谱软件 编辑:程序博客网 时间:2024/05/17 20:30
#include<stdio.h>  #include<string.h>  #include<algorithm>#include<queue>#include<math.h>using namespace std;struct node{    int u,val;    int next;}e[100000*4];int top;int head[100005];void add(int u,int v){    e[top].u=v;    e[top].next=head[u];    head[u]=top++;}int colorsum[2];int color[100005],f;void dfs(int x,int c){   //if(f==1)return;    color[x]=c;    colorsum[c]++;    for(int i=head[x];i!=-1;i=e[i].next)    {        int u=e[i].u;        if(color[u]==-1)            dfs(u,!c);        else if(color[u]==c)        {            f=1;            return;        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        memset(color,-1,sizeof(color));        memset(head,-1,sizeof(head));        top=0;        scanf("%d%d",&n,&m);        for(int i=0;i<m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            add(a,b);            add(b,a);        }        f=0;        int ans1=0,ans2=0;        if(n<=1)        {            printf("Poor wyh\n");            continue;        }        if(m==0)        {            printf("%d %d\n",n-1,1);            continue;        }        for(int i=1;i<=n;i++)        {            if(f==1)                break;                colorsum[0]=colorsum[1]=0;            if(color[i]==-1)            {//printf("ok");                dfs(i,0);                if(colorsum[0]>colorsum[1])                {                    ans1+=colorsum[0];                    ans2+=colorsum[1];                }                else                {                     ans1+=colorsum[1];                    ans2+=colorsum[0];                }            }        }        if(f)        {            printf("Poor wyh\n");        }        else        {            printf("%d %d\n",ans1,ans2);        }    }}

原创粉丝点击