所谓二分图,最直观的说,就是对一个有n个定点的图,给图上每个定点染色,能够保证每个相邻的顶点的颜色不同,即为二分图。
那么,一张图究竟是不是二分图怎么判断呢。很简单,即对图上每个点进行染色就好,因此若用dps(深搜)来染色并进行判断,答案便能很快出来。代码如下:
#include<iostream>
#include<vector>// 这里用邻接表的方法制图;
#include<cstring>
#define MAX_V 1001
using namespace std;
vector<int>G[MAX_V];
int C[MAX_V];//保存顶点i的颜色(1或者-1);
void init(int V,int E){//创建初始图;
memset(C,0,sizeof(C));//将顶点的颜色初始化为0;
for(int i=0;i<E;i++){
int s1,s2;
G[s1].push_back(s2);//s1向s2连线;
G[s2].push_back(s1);//因为是无向图,所以s2也要反过来 向s1连线;
}
}
bool dfs(int v,int c){
C[v]=c;//将顶点v染色为c;
for(int i=0;i<G[v].size();i++){
if(C[G[v][i]]==c) return false;//如果与相邻的顶点颜色相同则返回false;
if(C[G[v][i]]==0 && !dfs(G[v][i],-c)) return false;
/*如果该相邻点还未染色,则将其颜色染为-c
*注意 !dfs(G[[v][i]],-c) 这一条件体现出了该dfs的精髓(递归)
*其意义为将该相邻顶点染为-c,并判断是否能够继续,若不行则返回false
*只要一次为false则之前的全为false
*/
}
return true;//连通的所有顶点都染过色了且满足相邻顶点颜色不同的条件则返回true;
}
int main(){
int V,E;
cin>>V>>E;//输入该图的顶点数和边的数目;
init(V,E);
for(int i=0;i<V;i++){
if(C[i]==0){
if(!dfs(i,1)){
cout<<"NO"<<endl;
return 0;
}
}
}
cout<<"YES"<<endl;
}
ps:本人也是萌新,如果出错请大神指正,感激不尽☺