【染色法】P1330 封锁阳光大学

拈花ヽ惹草 提交于 2019-11-30 21:34:58
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 struct Edge
 7 {
 8     int n;
 9     int next;
10 }edge[100010];
11 
12 int head[10010];
13 int cnt;
14 bool vis[10010];
15 int cla[10010];
16 int sum[2];
17 
18 void add(int a, int b)
19 {
20     cnt++;
21     edge[cnt].n = b;
22     edge[cnt].next = head[a];
23     head[a] = cnt;
24 }
25 
26 bool dfs(int num, int c)
27 {
28     if (vis[num])
29     {
30         if (cla[num] == c) return true;
31         return false;
32     }
33     vis[num] = true;
34     sum[c]++;
35     cla[num] = c;
36     bool flag = true;
37     for (int i = head[num]; i && flag; i = edge[i].next)
38     {
39         if (!dfs(edge[i].n, 1 - c)) flag = false;
40     }
41     return flag;
42 }
43 
44 int main()
45 {
46     int n;
47     cin >> n;
48     int m;
49     cin >> m;
50     for (int i = 0; i < m; i++)
51     {
52         int a, b;
53         cin >> a >> b;
54         add(a, b);
55         add(b, a);
56     }
57     int ans = 0;
58     for (int i = 1; i <= n; i++)
59     {
60         memset(sum, 0, sizeof(sum));
61         if (vis[i]) continue;
62         if (!dfs(i, 0))
63         {
64             cout << "Impossible";
65             return 0;
66         }
67         ans += min(sum[0], sum[1]);
68     }
69     cout << ans;
70 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!