CodeForce 687A 二分图 交叉染色
来源:互联网 发布:工艺软件有什么 编辑:程序博客网 时间:2024/05/16 17:07
题意
判断一个图是否是二分图,并分别输出两个集合的点。二分图是指一个图的点能分成两个集合,任意一个集合里的点都互不相连。更直观的定义大家请自行搜索。
分析
二分图的判断方法对图上的点进行交叉染色(即相邻的点染不同颜色),如果遇到两个相邻的点的颜色是一样的,说明不是二分图(可用三角形说明)。如果没有遇到过这样的点,说明是二分图。
PS
我的程序一直wa不知道错在哪里。网上的解法大多复杂。
解法
BFS,DFS均可
#include<cstdio>#include<vector>#include<cstring>using namespace std;#define N 100010int color[N];vector<int> g[N],ans[3];bool flag = true;int n,m,t1,t2;void init(){ memset(color,0,sizeof(color)); for(int i=0;i<m;i++) { scanf("%d %d",&t1,&t2); g[t1].push_back(t2); g[t2].push_back(t1); }}bool vis(int i){return color[i];} bool dfs(int now,int c){ color[now] = c;//染色 ans[c].push_back(now); for(int i = 0;i < g[now].size();i++) { int next = g[now][i]; if(vis(next)) { if(c == color[next]) return false; } else if(!dfs(next,3-c)) return false; } return true;}void printColor(int c){ int s = ans[c].size(); printf("%d\n",s); for(int i = 0; i < s;i++) printf("%d ",ans[c][i]); printf("\n");}void print(bool ans){ if(ans == false) printf("-1\n"); else { printColor(1); printColor(2); }}int main(){ scanf("%d%d",&n,&m); init(); for(int i=1;i<=n;i++) if(!vis(i) && !g[i].empty()) flag = dfs(i,1); print(flag);}
阅读全文
0 0
- CodeForce 687A 二分图 交叉染色
- Codeforce 85E (二分答案+二分图染色)
- 交叉染色法判断二分图
- HDU 4751 交叉染色判断二分图
- 交叉染色法判定二分图
- UVA 10004 Bicoloring(二分图 交叉染色)
- 二分图匹配以及交叉染色
- URAL 2017 Best of a bad lot(二分图交叉染色)
- hdu 2444 交叉染色判断二分图+二分最大匹配
- CodeForces 687A - NP-Hard Problem(二分图染色)
- Codeforces-687A NP-Hard Problem(二分图染色)
- poj2942(双联通分量,交叉染色判二分图)
- HDU 4751 — Divide Groups 交叉染色判二分图
- poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图
- CodeForces 687A - NP-Hard Problem(二分染色)
- POJ 2492 A Bug's Life【二分图染色法】
- 【CodeM初赛A 6】二分图染色 题解
- HDU1829 A Bug's Life dfs黑白染色二分图
- Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗
- 前端学习之路-看到的优秀文章
- C++ 观察者模式 (包含模板)
- MAC显示屏的网页图片兼容方案
- SPOJ
- CodeForce 687A 二分图 交叉染色
- ubantu16.04lts 创建python虚拟环境
- iOS UIScrollview 和侧滑手势冲突解决方法
- python库大全
- iOS UIScrollview 取消弹簧效果
- HDU
- HDU4355 三分
- 判断某个字符串是否是合法IP
- 拦截器,过滤器,监听器的区别