sgu 172 eXam 二分图染色

来源:互联网 发布:淘宝保存的草稿在哪里 编辑:程序博客网 时间:2024/05/18 13:26

       按读入建图,dfs的时候,如果相邻的点已经有颜色并且和当前点的颜色相同,那么一定无解,否则染上不同与当前点的颜色继续dfs就行,注意考虑多个联通量的问题...

      

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string>#include <cstring>#include <cmath>#include <queue>#include <stack>using namespace std;typedef long long ll;bool g[220][220];int col[220];int n,m,p,q,k;bool flag;void dfs(int u,int t){    for (int i=1; i<=n; i++)    if (g[u][i] && i!=u)    {        if (col[i]==-1)        {            col[i]=t^1;            dfs(i,t^1);        }        else if (col[i]==t)        {            flag=false;            return;        }        if (!flag) return;    }}int main(){//    freopen("in.txt","r",stdin);    memset(g,false,sizeof g);    scanf("%d%d",&n,&m);    int x,y;    for (int i=1; i<=m; i++)    {        scanf("%d%d",&x,&y);        g[x][y]=g[y][x]=true;    }    memset(col,-1,sizeof col);    flag=true;    for (int i=1; i<=n; i++)    if (col[i]==-1)    {        col[i]=0;        dfs(i,0);    }    if (flag)    {        puts("yes");        int ans=0;        for (int i=1; i<=n; i++)        if (!col[i]) ans++;        printf("%d\n",ans);        for (int i=1; i<=n; i++)        if (!col[i])        printf("%d ",i);        puts("");    }    else puts("no");    return 0;}