图的二着色问题

实验任务
对于给定的图 G,如果存在一种用两种颜色对顶点着色的方案,使得图中任意一条边所
连接的两个顶点着不同颜色,则称图 G 是可二着色的。
你的任务是对于给定的图 G,计算是否可二着色。
数据输入
第一行有两个整数 n 和 m(1<=n<=100000, 0<=m<=100000),表示给定的图 G 有 n 个顶
点和 m 条边。
接下来 m 行,每行有两个整数 x 和 y( 1<=x,y<=n),表示图 G 的一条边( x, y)。
数据输出
如果图 G 是可二着色的,则输出"Yes", 否则输出"No"。
输入示例  输出示例
8 7         Yes
1 3
1 6
2 8
3 7
4 5
5 6

5 8

 #include<iostream>       
using namespace std;       
int n,m;       
struct zhuose      
{       
  int u;       
  int next;       
}edge[200005];       
int head[100005],vis[100005],color[100005];       
int k;       
void add(int a,int b)       
{       
  edge[k].u=b;       
  edge[k].next=head[a];       
  head[a]=k;       
  k++;       
}       
int fanan(int s,int c)       
{       
    vis[s]=1;       
    color[s]=c;       
    int i;       
    for(i=head[s];i!=-1;i=edge[i].next)       
    {       
        int v=edge[i].u;       
        if(vis[v]==0)       
      if(fanan(v,1-c)==0)       
          return 0;       
        if(vis[v]==1&&color[v]!=1-c)       
            return 0;       
    }       
  return 1;       
}       
int main()       
{       
    int i,j,a,b;       
  while(cin>>n>>m)       
  {       
      k=0;       
      memset(color,-1,sizeof(color));       
      memset(vis,0,sizeof(vis));       
      memset(head,-1,sizeof(head));       
    for(i=1;i<=m;i++)       
    {       
      scanf("%d%d",&a,&b);       
      add(a,b);       
      add(b,a);       
    }       
    int flag=0;       
    for(i=1;i<=n;i++)       
        if(vis[i]==0)       
            if(fanan(i,0)==0)       
            {     
                flag=1;     
                break;     
            }       
            if(flag)       
                cout<<"No"<<endl;       
            else       
                cout<<"Yes"<<endl;       
  }       
  return 0;       
}       


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值