NP-Hard Problem(cf#360)
2016-07-12 16:50
330 查看
C. NP-Hard Problem
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex cover problem very interesting.
Suppose the graph G is given. Subset A of
its vertices is called a vertex cover of this graph, if for each edge uv there is at
least one endpoint of it in this set, i.e.
or
(or
both).
Pari and Arya have won a great undirected graph as an award in a team contest. Now they have to split it in two parts, but both of them want their parts of the graph to be a vertex cover.
They have agreed to give you their graph and you need to find two disjoint subsets of its vertices A and B,
such that both A and B are vertex cover
or claim it's impossible. Each vertex should be given to no more than one of the friends (or you can even keep it for yourself).
Input
The first line of the input contains two integers n and m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) —
the number of vertices and the number of edges in the prize graph, respectively.
Each of the next m lines contains a pair of integers ui and vi (1 ≤ ui, vi ≤ n),
denoting an undirected edge between ui and vi.
It's guaranteed the graph won't contain any self-loops or multiple edges.
Output
If it's impossible to split the graph between Pari and Arya as they expect, print "-1" (without quotes).
If there are two disjoint sets of vertices, such that both sets are vertex cover, print their descriptions. Each description must contain two lines. The first line contains a single integer k denoting
the number of vertices in that vertex cover, and the second line contains kintegers — the indices of vertices. Note that because of m ≥ 1,
vertex cover cannot be empty.
Examples
input
output
input
output
Note
In the first sample, you can give the vertex number 2 to Arya and vertices numbered 1 and 3 to
Pari and keep vertex number 4 for yourself (or give it someone, if you wish).
In the second sample, there is no way to satisfy both Pari and Arya.
题意是要将一个图的顶点分成两个互不相交的子集,也就是说每一条边的两个顶点不能同时给一个人,需要把每条边都切开。
给每个顶点都构建一个邻接表,把该点先染为一种色,再把他所有的邻接点都染为另一个色,跑完一轮bfs。每个点都需要先判断一次是否已经被染色,若没有则对其进行一轮染色,以此保证不是联通图也能把每个点都进行了染色。
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex cover problem very interesting.
Suppose the graph G is given. Subset A of
its vertices is called a vertex cover of this graph, if for each edge uv there is at
least one endpoint of it in this set, i.e.
or
(or
both).
Pari and Arya have won a great undirected graph as an award in a team contest. Now they have to split it in two parts, but both of them want their parts of the graph to be a vertex cover.
They have agreed to give you their graph and you need to find two disjoint subsets of its vertices A and B,
such that both A and B are vertex cover
or claim it's impossible. Each vertex should be given to no more than one of the friends (or you can even keep it for yourself).
Input
The first line of the input contains two integers n and m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) —
the number of vertices and the number of edges in the prize graph, respectively.
Each of the next m lines contains a pair of integers ui and vi (1 ≤ ui, vi ≤ n),
denoting an undirected edge between ui and vi.
It's guaranteed the graph won't contain any self-loops or multiple edges.
Output
If it's impossible to split the graph between Pari and Arya as they expect, print "-1" (without quotes).
If there are two disjoint sets of vertices, such that both sets are vertex cover, print their descriptions. Each description must contain two lines. The first line contains a single integer k denoting
the number of vertices in that vertex cover, and the second line contains kintegers — the indices of vertices. Note that because of m ≥ 1,
vertex cover cannot be empty.
Examples
input
4 2 1 2 2 3
output
1 2 2 1 3
input
3 3 1 2 2 3 1 3
output
-1
Note
In the first sample, you can give the vertex number 2 to Arya and vertices numbered 1 and 3 to
Pari and keep vertex number 4 for yourself (or give it someone, if you wish).
In the second sample, there is no way to satisfy both Pari and Arya.
题意是要将一个图的顶点分成两个互不相交的子集,也就是说每一条边的两个顶点不能同时给一个人,需要把每条边都切开。
给每个顶点都构建一个邻接表,把该点先染为一种色,再把他所有的邻接点都染为另一个色,跑完一轮bfs。每个点都需要先判断一次是否已经被染色,若没有则对其进行一轮染色,以此保证不是联通图也能把每个点都进行了染色。
#include <iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cstring> using namespace std; const int M=1e5+5; int h[M],cnt=0,c[M]; struct node { int next,to; }e[M*2]; void add(int u,int v) //构建邻接表 { e[cnt].to=v; e[cnt].next=h[u]; h[u]=cnt++; } bool bfs(int s) { c[s]=1; queue<int>q; q.push(s); while(!q.empty()) { int x=q.front(); q.pop(); for(int i=h[x];i+1;i=e[i].next) //对该点的所有邻接点染色 { int t=e[i].to; if(c[t]==-1) { c[t]=!c[x]; q.push(t); } else if(c[x]==c[t]) return 1; } } return 0; } int main() { int n,m,u,v; memset(h,-1,sizeof(h)); memset(c,-1,sizeof(c)); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } for(int i=1;i<=n;i++) //对每个点判断是否被染色 { if(c[i]==-1) { if(bfs(i)) { puts("-1"); return 0; } } } int aa=0,bb=0; int b[M],a[M]; for(int i=1;i<=n;i++) { if(c[i]==1) b[bb++]=i; else a[aa++]=i; } printf("%d\n",aa); for(int i=0;i<aa;i++) printf("%d ",a[i]); printf("\n%d\n",bb); for(int i=0;i<bb;i++) printf("%d ",b[i]); printf("\n"); return 0; }
相关文章推荐
- 偏差和方差
- Jackson反序列化的实现方法
- Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log
- Linux的进程/线程通信方式总结
- 从结构体成员获取结构体地址的方法
- UFT中怎么处理 “分段截断(null)由于将在索引、主关键字、或关系中创建重复的值,请求对表的改变没有成功。。”...
- 在Java中动态的加载一个布局
- HDU 2063 过山车(二分匹配入门)
- 解决自定义securityMetadataSource不能使用依赖注入的问题,nullpointer问题,空指针问题
- Linux软件安装包中devel与非devel包之间的区别
- WCF学习之旅—基于ServiceDebug的异常处理(十七)
- 【bzoj4027】 [HEOI2015]兔子与樱花
- Sum of Two Integers
- Drools 6.0 Hello World
- Maven详解之仓库------本地仓库、远程仓库、私服
- deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
- 详解资源文件Drawable下面的shape标签
- 合金
- <a>标签跳转和执行js函数,href和onclick属性
- +function ($) { "use strict";}(window.jQuery);全面分析