hdu 3062 (2-sat)
阿新 • • 發佈:2018-12-04
Description
有n對夫妻被邀請參加一個聚會,因為場地的問題,每對夫妻中只有1人可以列席。在2n 個人中,某些人之間有著很大的矛盾(當然夫妻之間是沒有矛盾的),有矛盾的2個人是不會同時出現在聚會上的。有沒有可能會有n 個人同時列席?Input
n: 表示有n對夫妻被邀請 (n<= 1000)m: 表示有m 對矛盾關係 ( m < (n - 1) * (n -1))
在接下來的m行中,每行會有4個數字,分別是 A1,A2,C1,C2
A1,A2分別表示是夫妻的編號
C1,C2 表示是妻子還是丈夫 ,0表示妻子 ,1是丈夫
夫妻編號從 0 到 n -1
Output
否則輸出 NO
Sample Input
2 1 0 1 1 1
Sample Output
YES
直接套模板
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <string> #include <functional> #include <cmath> #include <set> #include <queue> #include <algorithm> #include <vector> #include <map> #include <stack> using namespace std; #define esp 1e-8 const double PI = acos(-1.0); const double e = 2.718281828459; const int inf = 2147483647; const long long mod = 1000000007; typedef long long ll; void fre() { freopen("alex.txt", "r", stdin); freopen("alex.txt", "w", stdout); } inline void in(int &x) { register char ch; while (ch = getchar(), (ch < '0' || ch > '9')); x = ch - '0'; while (ch = getchar(), ch >= '0' && ch <= '9') x = x * 10 + ch - '0'; } inline void out(int x) { register char hc[30]; register int len = 0; hc[len++] = x % 10 + '0'; while (x /= 10) hc[len++] = x % 10 + '0'; for (int i = len - 1; i >= 0; i--) putchar(hc[i]); } const int maxn = 2005; struct node { int to, next; }edge[maxn * maxn]; int hand[maxn], belong[maxn], dfn[maxn], low[maxn], vis[maxn], st[maxn]; int tot, num, index, cnt; void addedge(int a, int b) { edge[tot].to = b; edge[tot].next = hand[a]; hand[a] = tot++; } void init() { memset(hand, -1, sizeof(hand)); memset(belong, -1, sizeof(belong)); memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); memset(vis, 0, sizeof(vis)); memset(st, 0, sizeof(st)); tot = 0; num = 0; index = 0; cnt = 0; } void Tarjan(int u) { dfn[u] = low[u] = index++; vis[u] = 1; st[num++] = u; for (int i = hand[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (!dfn[v]) { Tarjan(v); low[u] = min(low[u], low[v]); } else if (vis[v]) { low[u] = min(low[u], dfn[v]); } } if (low[u] == dfn[u]) { cnt++; int v; do { v = st[--num]; vis[v] = 0; belong[v] = cnt; } while (u != v); } } int main() { int n, m, i, j; while(~scanf("%d%d", &n, &m)) { init(); for (i = 1; i <= m; ++i) { int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d); addedge(a * 2 + c, b * 2 + !d); addedge(b * 2 + d, a * 2 + !c); } for (i = 0; i < 2 * n; ++i) { if (!dfn[i]) Tarjan(i); } int ans = 1; for (i = 0; i < n; ++i) { if (belong[i * 2] == belong[i * 2 + 1]) { ans = 0; break; } } puts(ans ? "YES" : "NO"); } }