★实验任务
对于给定的图 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
对于给定的图 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;
}