二分圖---染色法
阿新 • • 發佈:2018-11-17
概念
就是頂點集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;
}