算法基础之染色法判定二分图
2023-12-19 23:42:47
染色法判定二分图
-
核心思想: 二分图 : 当且仅当图中不含有奇数环(环中边的数量为奇数)
-
染色法 : 从原点开始染色 1 / 2 当冲突时即含有奇数环
-
#include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010 , M = N * 2; //无向图 int n,m; int h[N],e[M],ne[M],idx; int color[N]; void add(int a,int b) { e[idx] = b , ne[idx] = h[a] , h[a] = idx++; } bool dfs(int u,int c) { color[u] = c; //染色 for(int i = h[u];i!=-1;i = ne[i]) //搜图 { int j = e[i]; //j为编号 if(!color[j]) //j没有染色 { if(!dfs(j, 3-c)) //j染色相反 搜j的路 { return false; } } else if(color[j] == c) return false; //i 和 j染色一样 说明冲突 } return true; } int main() { cin>>n>>m; memset(h,-1,sizeof h); while(m--) { int a,b; cin>>a>>b; add(a,b) , add(b,a); } bool flag = true; //标记是否含有奇数环 for(int i=1;i<=n;i++) { if(!color[i]) //i没有染色 { if(!dfs(i,1)) //i染成1 //如果i>1时 没有染色 因为是无向图 说明i和1不联通 所以原点染色1 / 2 都可以 { flag = false; //返回了false 说明有奇数环 break; } } } if (flag) puts("Yes"); else puts("No"); }
-
文章来源:https://blog.csdn.net/Pisasama/article/details/135095192
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!