AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N =100010, M = 200010;
int n,m;
int h[N],e[M],ne[M],idx;
int color[N];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx;
idx++;
}
bool dfs(int u,int c)
{
color[u]=c;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(!color[j])
{
if(!dfs(j,3-c))return false;
}
else
{
if(color[j]==c)return false;
}
}
return true;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
bool flag=true;
for(int i=1;i<=n;i++)
{
if(!color[i])
{
if(!dfs(i,1))
{
flag=false;
break;
}
}
}
if(!flag)cout<<"No";
else cout<<"Yes";
return 0;
}
相关解释:
这里的思路是深度优先遍历整个图,假设遍历到了某个点,然后去遍历它所能连接的点,有两种情况:
1.这个点没有被染色,那么就去染它
2.已经有颜色了,然后判断一下当前这个点和他所能扩展到的点是不是相同的颜色,如果相同就返回false(这里的搜索只要有一个不符合要求直接返回false)。
注意一下这里要遍历每个点然后进行dfs,如果从第一个点dfs的话,这个图可能不是一个