Codeforces Round #361 (Div. 2) C.NP-Hard Problem
2016-07-01 20:35
260 查看
题目连接:http://codeforces.com/contest/688/problem/C
题意:给你一些边,问你能否构成一个二分图
题解:二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
直接上一个DFS就搞定了
#include<cstdio> #include<set> #include<vector> #define pb push_back #define F(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int N=1e5+7; int vis ,n,m,x,y,ft,col ,fg; vector<int>Q ; set<int>a,b; set<int>::iterator it; void dfs(int pre,int now,int co){ if(vis[now]&&col[now]==co)fg=1; if(fg||vis[now])return; vis[now]=1,col[now]=!co; if(col[now])a.insert(now);else b.insert(now); for(int i=0;i<Q[now].size();i++){ if(Q[now][i]!=pre){ dfs(now,Q[now][i],col[now]); } } } int main(){ while(~scanf("%d%d",&n,&m)){ fg=0; F(i,1,n)Q[i].clear(); a.clear(),b.clear(); F(i,1,n)vis[i]=0; F(i,1,m){ scanf("%d%d",&x,&y); Q[x].pb(y),Q[y].pb(x); } F(i,1,n)if(!vis[i])dfs(0,i,0); if(fg)puts("-1"); else{ printf("%d\n",a.size()),ft=1; for(it=a.begin();it!=a.end();it++) if(ft)printf("%d",*it),ft=0;else printf(" %d",*it); printf("\n%d\n",b.size()),ft=1; for(it=b.begin();it!=b.end();it++) if(ft)printf("%d",*it),ft=0;else printf(" %d",*it); puts(""); } } return 0; }View Code
相关文章推荐
- C++11实现生产者消费者问题
- Matlab如何建立和调用M文件(M-File)
- 阅读Activity源码笔记
- 使用C#开发HTTP服务器系列之访问主页
- Java函数中传值与传引用的区别
- Spring事务管理
- ArcGIS DEM数据、创建随机点、创建随机点工具\IDW插值
- Qt---快速建立对话框
- Qt之字典划词
- Qt之字典划词
- java获取当月天数,指定年月的天数,指定日期获取对应星期
- 存储过程学习
- EF的增删改查
- Error:Maven Resources Compiler: Failed to copy 'XXX' to 'YYY': YYY (拒绝访问。)
- Error:Maven Resources Compiler: Failed to copy 'XXX' to 'YYY': YYY (拒绝访问。)
- 一道面试题,一个五位数字ABCDE*4=EDCBA,这个五个数字不重复,请问A,B,C,D,E分别是几?
- SQLite
- LeetCode:Max Points on a Line
- intellij idea module设置 dependencies的export
- 计算机常用端口一览表