【HDOJ】1814 Peaceful Commission

2-SAT基础题目。

 1 /* 1814 */
 2 #include <iostream>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <cstdlib>
 8 using namespace std;
 9 
10 #define MAXN 8005
11 
12 vector<int> vc[MAXN*2];
13 bool visit[MAXN*2];
14 int S[MAXN*2], top;
15 int n, m;
16 
17 bool dfs(int u) {
18     if (visit[u^1])    return false;
19     if (visit[u])    return true;
20     
21     visit[u] = true;
22     S[top++] = u;
23     for (int i=0; i<vc[u].size(); ++i) {
24         if (!dfs(vc[u][i]))
25             return false;
26     }
27     return true;
28 }
29 
30 int main() {
31     int ii, jj;
32     int i, j, k;
33     bool flag;
34     
35     #ifndef ONLINE_JUDGE
36         freopen("data.in", "r", stdin);
37     #endif
38     
39     while (scanf("%d %d", &n, &m) != EOF) {
40         k = n+n;
41         for (i=0; i<k; ++i)
42             vc[i].clear();
43         memset(visit, false, sizeof(bool)*k);
44         while (m--) {
45             scanf("%d %d", &i, &j);
46             --i;
47             --j;
48             ii = (i&1) ? i-1:i+1;
49             jj = (j&1) ? j-1:j+1;
50             vc[i].push_back(jj);
51             vc[j].push_back(ii);
52         }
53         flag = true;
54         for (i=0; i<k; i+=2) {
55             if (! (visit[i]||visit[i+1])) {
56                 top = 0;
57                 if (!dfs(i)) {
58                     while (top--)
59                         visit[S[top]] = false;
60                     if (!dfs(i+1)) {
61                         flag = false;
62                         break;
63                     }
64                 }
65             }
66         }
67         if (flag) {
68             for (i=0; i<k; ++i)
69                 if (visit[i])
70                     printf("%d
", i+1);
71         } else {
72             puts("NIE");
73         }
74     }
75     
76     return 0;
77 }
原文地址:https://www.cnblogs.com/bombe1013/p/4335831.html