图论 染色问题

来源:互联网 发布:centos共享文件夹在哪 编辑:程序博客网 时间:2024/05/01 00:51
//判断图中两种颜色是否可以对每个结点进行着色,每两个点颜色不同#include <iostream>#include<cstdio>#include<cstring>#define MAX 100using namespace std;int v,e;int g[MAX][MAX];int color[MAX];void createGraph(){    int start,end;    memset(g,0,sizeof(g));    memset(color,0,sizeof(color));    scanf("%d%d",&v,&e);    while(e--)    {        scanf("%d%d",&start,&end);        g[start][end]=1;        g[end][start]=1;    }}//用1或者-1来填满节点bool dfs(int n,int c){    color[n]=c;    for(int i=1;i<=v;i++)    {        //在n到i有边的情况下:if(g[n][i]!=0){//如果n到i点有边,并且邻接点染相同颜色就返回false if(color[i]==c)return false;//如果n到i点有边,但是还未染色,就对i点染色-cif(color[i]==0 && !dfs(i,-c)){return false;}}    }    return true;}void solve(){    for(int i=1;i<=v;i++)    {        //遍历每个点,如果还有点没有染色,就对它进行染色        if(color[i]==0)        {            if(!dfs(i,1))            {                printf("NO!\n");                    return;            }        }    }    printf("YES!\n");}int main(){    createGraph();    solve();    printf("\n");printf("每一点的染色情况:\n");    for(int i=1;i<=v;i++)    {        printf("%d\t",color[i]);    }    return 0;}


 

原创粉丝点击