该博文主要结合挑战程序设计竞赛98页的讲解
二分图判定,给一个图,有V个点和E个边,给每个顶点染色,相邻颜色不同,能否最多用两种颜色染色,没有重边喝自环
用两种颜色,也就是染了一个点之后,相邻的点颜色也就确认了。
从一个点出发,依次确定相邻顶点颜色,也就可以判断了。
所以书中用到了dfs深度优先搜索实现
伪代码如下:
bfs(v,c){
//对v染色c
//遍历相邻的点进行染色
{//同色 false
//继续bfs染色并判断。
}
//都染色了true
}
#include <cstdio> #include <cstring> #include <vector> #define MAX 102 using namespace std; vector<int> G[MAX]; int color[102]; int V,E; bool dfs(int v,int c){ color[v]=c; for(int i=0;i<G[i].size();i++){ if(color[G[v][i]]==c) return false; if(color[G[v][i]]==0) if(!dfs(G[v][i],-c)){ return false; } } return true; } void solve(){ for(int i=0;i<V;i++){ if(color[i]==0){ if(!dfs(i,1)){ printf("No\n"); return; } } } printf("Yes\n"); } int main(){ int s,t; scanf("%d%d",&V,&E); memset(color,0,sizeof(color)); for(int i=0;i<E;i++){ scanf("%d%d",&s,&t); G[s].push_back(t); G[t].push_back(s); } solve(); for(int i=0;i<V;i++) printf("%d ",color[i]); return 0; }
注意无向图从s到t和t到s都要存进去
//边上有属性: struct edge{ int to,cost; }; vector<edge> G[MAX_V];
邻接链表中查询两点之间是否有变需要遍历一遍链表才能知道。