1. 程式人生 > >二分圖---染色法

二分圖---染色法

概念

就是頂點集V可分割為兩個互不相交的子集,並且圖中每條邊依附的兩個頂點都分屬於這兩個互不相交的子集,兩個子集內的頂點不相鄰。
在這裡插入圖片描述

從其中一個點開始判斷,將跟它相連的點染成和它不同的顏色,如果最後相連的點有相同的顏色,則不是二分圖。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string> #include <cmath> #include <stack> #include <queue> #include <map> #include <set> #define MAX 0x3f3f3f3f #define fori(a,b) for(int i=a;i<=b;i++) #define forj(a,b) for(int j=a;j<=b;j++) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std;
typedef long long LL; const double PI = acos(-1); int ch[2222][2222]; int judge[2222]; int flag; queue<int>q; int _fs(int now,int n){ judge[now]=1; q.push(now); while(!q.empty()){ int f=q.front(); q.pop(); fori(1,n){ if(ch[f][i]&&judge[i]
==-1){ judge[i]=!judge[f]; q.push(i); } if(ch[f][i]&&judge[f]==judge[i]){ flag=0; return 0; } } } return 1; } int main() { int t,n,m,a,b; cin >> t; fori(1,t){ while(!q.empty()) q.pop(); scanf("%d%d",&n,&m); flag=1; mem(ch,0); forj(1,n) judge[j]=-1; while(m--){ scanf("%d%d",&a,&b); ch[a][b]=ch[b][a]=1; } forj(1,n){ if(judge[j]==-1&&!_fs(j,n)){ flag=0; break; } } } if(flag) cout << "No" <<endl; else cout << "Yes" << endl; } return 0; }