二分图【图搜索】

来源:互联网 发布:大数据分析报告案例 编辑:程序博客网 时间:2024/05/01 04:28

该博文主要结合挑战程序设计竞赛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];

邻接表在边少的时候占用少量内存,但是和邻接矩阵相比较为复杂

邻接链表中查询两点之间是否有变需要遍历一遍链表才能知道。









0 0
原创粉丝点击