Codeforces Round #360 (Div. 1)A (二分图&dfs染色)

题目链接:http://codeforces.com/problemset/problem/687/A

题意:给出一个n个点m条边的图,分别将每条边连接的两个点放到两个集合中,输出两个集合中的点,若不可能则输出-1;

思路:通过画图我们不难发现,图中没有出现长度为奇数的环则是可行的,反之则是不行的。那么现在我们只需判断有木有长度为偶数的环即可。

对于这点我们可以直接用dfs搜索+染色,对于当前标记为1的点,我们将其所有儿子标记为2, 对于当前标记为2的点,将其所有儿子标记为1,若出现某个节点的标记与其儿子相同,则有长度为奇数的环。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int MAXN=1e5+10;
 5 vector<int> v[MAXN];
 6 vector<int> st1, st2;
 7 bool flag=false;
 8 int vis[MAXN];
 9
10 void dfs(int point){
11     if(flag){
12         return;
13     }
14     for(int i=0; i<v[point].size(); i++){
15         int cnt=v[point][i];
16         if(vis[point]==vis[cnt]){
17             flag=true;
18             return;
19         }else if(!vis[cnt]){
20             if(vis[point]==1){
21                 vis[cnt]=2;
22                 st2.push_back(cnt);
23                 dfs(cnt);
24             }else if(vis[point]==2){
25                 vis[cnt]=1;
26                 st1.push_back(cnt);
27                 dfs(cnt);
28             }
29         }
30     }
31 }
32
33 int main(void){
34     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
35     int n, m, x, y;
36     cin >> n >> m;
37     while(m--){
38         cin >> x >> y;
39         v[x].push_back(y);
40         v[y].push_back(x);
41     }
42     for(int i=1; i<=n; i++){
43         if(v[i].size()==0){
44             continue;
45         }else if(!vis[i]){
46             vis[i]=1;
47             st1.push_back(i);
48             dfs(i);
49         }
50     }
51     if(flag){
52         cout << -1 << endl;
53     }else{
54         cout << st1.size() << endl;
55         for(int i=0; i<st1.size(); i++){
56             cout << st1[i] << " ";
57         }
58         cout << endl;
59         cout << st2.size() << endl;
60         for(int i=0; i<st2.size(); i++){
61             cout << st2[i] << " ";
62         }
63         cout << endl;
64     }
65     return 0;
66 }
时间: 2024-12-13 15:02:39

Codeforces Round #360 (Div. 1)A (二分图&dfs染色)的相关文章

Codeforces Round #360 (Div. 2) D 数学推导 E dp

Codeforces Round #360 (Div. 2) A  == B  水,但记一下: 第 n 个长度为偶数的回文数是  n+reverse(n). C    dfs 01染色,水 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i

Codeforces Round #383 (Div. 1) C(二分图)

一道很巧妙的二分图的题目 简单分析性质可知,一个合法序列一定是由12,21这样的子串构成的,所以相邻的每隔2个两两配对 然后BF和GF互相配对,思考一下,如果存在奇环,那么必定有一个BG有两个GF,或者一个GF有两个BF,所以不存在这种情况,一定有解 直接二分图判断即可 #include <iostream> #include <cstdio> #include <vector> #define mp make_pair #define fi first #define

Codeforces Round #360 (Div. 2)C. NP-Hard Problem

题意:给出一个无向图,问是否可以是二分图, 思路:染色就行了,二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 struct node{ 5 int

Codeforces Round #360 (Div. 2) C D E

每次AB秒出 到了C难度陡然上升...翻译都弄不懂... C 给出一张图 找出两个点的覆盖集(覆盖集是指这图中每条边都有至少一个点在这个点集里面) 并且两个点集没有交集 英文很难看懂...就是二分图的判定 看看这张图是不是二分图 输出两边的点 不是二分图输出-1 坑点是这是special judge 但是题目没说 每个联通块都要进行一次bfs 那些独立点可以不输出也可以随意分配 D 给出k与n个数ci 我们知道一个未知的数x%ci的数 问能不能求出x%k的数 可以利用中国剩余定理来解 如果我们知

570D Codeforces Round #316 (Div. 2) D(dfs序,时间戳,二分

题目:一棵树上每个节点有个字符值,询问每个节点的深度为h的子节点的字符是否能组成一个回文串. 思路:首先是奇妙的dfs序和时间戳,通过记录每个节点的dfs进出时间,可以发现某个节点的子节点的进出时间均在该节点的进出时间范围内(这是很直观的dfs的性质),这样可以把树形结构转变为线性结构,方便进行各种处理.dfs一遍处理时间戳,每个节点的深度,并记录每个深度的节点都有哪些,此时每个深度的节点就是排好序的.然后对于一个询问,可以利用二分查找确定子节点在该层的哪一段.对于每一层,预先处理每个字符的前缀

Codeforces Round #360 (Div. 2) D. Remainders Game(中国剩余定理)

D. Remainders Game Today Pari and Arya are playing a game called Remainders. Pari chooses two positive integer x and k, and tells Arya k but not x. Arya have to find the value . There are n ancient numbers c1, c2, ..., cn and Pari has to tell Arya  i

Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 并查集求奇偶元环

D. Dividing Kingdom II Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great. These two had some problems about the numbers they like, so they decided to divide the great kingdom between themselves. The

B. Nirvana Codeforces Round #549 (Div. 2) (递归dfs)

---恢复内容开始--- Kurt reaches nirvana when he finds the product of all the digits of some positive integer. Greater value of the product makes the nirvana deeper. Help Kurt find the maximum possible product of digits among all integers from 1 to n. Input

Codeforces Round #359 (Div. 2) C. Robbers&#39; watch (暴力DFS)

题目链接:http://codeforces.com/problemset/problem/686/C 给你n和m,问你有多少对(a, b) 满足0<=a <n 且 0 <=b < m 且a的7进制和n-1的7进制位数相同 且b的7进制和m-1的7进制位数相同,还有a和b的7进制上的每位上的数各不相同. 看懂题目,就很简单了,先判断a和b的7进制位数是否超过7,不超过的话就dfs暴力枚举计算就可以了. 1 //#pragma comment(linker, "/STACK