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
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
否则输出 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");
}
}