二分图判断
图论--二分图判断
染色法
原理:使用两种颜色对图中的结点进行染色,若出现相邻结点颜色相同,则不是二分图(或偶图)。
选择任意一点开始,染为红色,并将相邻的结点染为蓝色。选择其中一个相邻的结点作为下一个结点重复这个过程,不过是把其相邻结点染为红色,直到全部染完色或者出现相邻结点同色的情况。(PS:如果相邻结点已经染色则不理会。)如果最后未出现相邻同色现象,则判断该图为二分图。
#include <iostream> #include <vector> #include <string.h> using namespace std; #define MAXSIZE 1001 vector<int> graph[MAXSIZE]; int color[MAXSIZE]; bool dfs(int u) { int len = graph[u].size(); for(int i=0;i<len;i++) { int v = graph[u][i]; if(color[v] == 0) { color[v] = color[u]^1; if(!dfs(v)) return false; } else if(color[u] == color[v]) return false; } return true; } int main() { int t,n,m,a,b; cin>>t; while(t--) { cin>>n>>m; memset(graph,0,sizeof(graph)); for(int i=1;i<=m;i++) { cin>>a>>b; graph[a].push_back(b); graph[b].push_back(a); } memset(color,0,sizeof(color)); int flag = true; for(int i=1;i<=n;i++) { if(color[i]==0) { if(!dfs(i)) { flag = false; break; } } } if(flag)cout<<"Yes\n"<<endl; else cout<<"No\n"<<endl; } return 0; }