CodeForces - 687A (连通图染色)
来源:互联网 发布:蓝牙共享网络给电脑 编辑:程序博客网 时间:2024/05/14 19:36
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 k integers — the indices of vertices. Note that because of m ≥ 1, vertex cover cannot be empty.
Example
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.
把一张图分给两个人,使得两个人获得的子图都是a vertex cover,满足这个的条件就是任意一条边两端的至少一点属于该子图。所以只需要染色,如果所有边两端的点都是不同颜色,就可以这样分给两人,否则不行。孤立的点不用管。
#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<map>#include<vector>#include<set>using namespace std;int n, m;vector<int> e[100005];int color[100005];bool dfs(int x){ bool ans = 1; while (!e[x].empty()){ int nn = e[x][e[x].size() - 1]; e[x].pop_back(); if (color[nn] == 0){ color[nn] = 3 - color[x]; ans = dfs(nn); } if (ans == 0){ break; } else if (color[nn] == color[x]){ ans = 0; break; } } return ans;}int main(){ scanf("%d%d", &n,&m); int a, b; for (int i = 0; i < m; i++){ scanf("%d%d", &a, &b); e[a].push_back(b); e[b].push_back(a); } bool is_ans = 1; for (int i = 1; i <= n; i++){ if (!e[i].empty()){ if (color[i] == 0){ color[i] = 1; } is_ans = dfs(i); } if (!is_ans)break; } if (is_ans){ int a = 0, b = 0; vector<int>ansa, ansb; for (int i = 1; i <= n; i++){ if (color[i] == 1){ a++; ansa.push_back(i); } else if (color[i] == 2){ b++; ansb.push_back(i); } } printf("%d\n",a); for (int i = 0; i < a; i++){ printf("%d", ansa[i]); if (i < a - 1)printf(" "); } printf("\n"); printf("%d\n", b); for (int i = 0; i < b; i++){ printf("%d", ansb[i]); if (i < b - 1)printf(" "); } } else{ printf("-1"); } return 0;}
- CodeForces - 687A (连通图染色)
- CodeForces 687A - NP-Hard Problem(二分图染色)
- Codeforces-687A NP-Hard Problem(二分图染色)
- 连通图染色
- CodeForces 687A - NP-Hard Problem(二分染色)
- Codeforces Round #360 (Div. 1) A. NP-Hard Problem(二分图染色)
- Codeforces 427C Checkposts【Tarjan强连通+缩点染色】
- CodeForce 687A 二分图 交叉染色
- CodeForces 624C Graph and String(二分图染色)
- [Codeforces 272E] Dima and Horses (图染色构造)
- [Codeforces 27D] Ring Road 2 (二分图染色)
- Codeforces 663C Graph Coloring(图染色dfs)
- POJ 1112 Team Them Up! (图(反图)染色+连通分量+动态规划) 解释代码
- POJ 1112 Team Them Up! (二分图染色+连通分量+DP)
- UVa 572 Oil Desposits (dfs 图 染色 八连通种子填充)
- codeforces 217A 连通块的个数
- POJ1112 Team Them Up! 连通图 染色 DP
- codeforces 624C 二分图染色
- Linux 系统挂载数据盘
- Linux任务前后台的切换 【转】
- javascript闭包
- 动态分配内存的原理
- 开篇
- CodeForces - 687A (连通图染色)
- 磁盘I/O
- append("A").append("B").append("C")和append("ABC")
- linux目录结构
- 用Awstats工具来分析httpd和tomcat的访问日志
- Spring Ioc 源码的初探
- 微积分公理化,赶超美日不难
- 关于static的一些理解
- 【Leetcode】290. Word Pattern