C. NP-Hard Problem
time limit per test
memory limit per test
input
output
minimum vertex cover
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.
disjoint subsets of its vertices A and B, such that both A and B
Input
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.
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
-1" (without quotes).
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 21 2 2 3
output
12 2 1 3
input
3 31 2 2 3 1 3
output
-1
Note
2 to Arya and vertices numbered 1 and 3 to Pari and keep vertex number 4
In the second sample, there is no way to satisfy both Pari and Arya.
判断是否为二分图。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 100005
using namespace std;
vector<int> v[maxn], p[2];
int vis[maxn];
bool dfs(int i, int c){
vis[i] = c;
p[c].push_back(i);
for(int j = 0; j < v[i].size(); j++){
int h = v[i][j];
if(vis[h] == c)
return false;
if(vis[h] == -1){
if(dfs(h, c^1) == false)
return false;
}
}
return true;
}
int main(){
// freopen("in.txt", "r", stdin);
int n, m, a, b;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++){
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
memset(vis, -1, sizeof(vis));
for(int i = 1; i <= n; i++){
if(vis[i] == -1 && dfs(i, 0) == false){
printf("%d\n", -1);
return 0;
}
}
for(int i = 0; i < 2; i++){
printf("%d\n", p[i].size());
for(int j = 0; j < p[i].size(); j++){
printf("%d", p[i][j]);
if(j < p[i].size()-1)
printf(" ");
}
if(p[i].size() > 0)
puts("");
}
return 0;
}