二分圖判斷
阿新 • • 發佈:2020-12-19
圖論--二分圖判斷
染色法
原理:使用兩種顏色對圖中的結點進行染色,若出現相鄰結點顏色相同,則不是二分圖(或偶圖)。
選擇任意一點開始,染為紅色,並將相鄰的結點染為藍色。選擇其中一個相鄰的結點作為下一個結點重複這個過程,不過是把其相鄰結點染為紅色,直到全部染完色或者出現相鄰結點同色的情況。(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) { if(color[u] == 1) color[v] = 2; else color[v] = 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)) { color[i]=1; flag = false; break; } } } if(flag)cout<<"Yes\n"<<endl; else cout<<"No\n"<<endl; } return 0; }