hdu 3062 (2-sat)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjw6463/article/details/52234027

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 
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");
	}
}


猜你喜欢

转载自blog.csdn.net/zjw6463/article/details/52234027
今日推荐