hdu 3062 (2-sat)

来源:互联网 发布:stringbuffer的源码 编辑:程序博客网 时间:2024/04/28 19:53

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

如果存在一种情况 则输出YES
否则输出 NO

Sample Input

2 10 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-8const 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");}}


0 0
原创粉丝点击