AC代码:
- #include
- #include
- #include
-
- 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的话,这个图可能不是一个