您的位置:首页

HLJU 1042 Fight (种类并查集)

2017-08-07 18:03 543 查看

1042: Fight

Time Limit: 1 Sec Memory Limit:
128 MB

Submit: 26 Solved: 8

[Submit][Status][Web
Board]

Description

尽管格斗是很须要技术的一项运动。可是打群架却不须要什么技术,并且场面一般比較混乱,分不清谁和谁是一伙的,仅仅能看出谁和谁不是一伙的,并且打群架常常会出现猪一样的队友。误伤自己人。

如今给你一些信息,请你根据这些信息推断是否一定存在猪一样的队友。

Input

包括多组測试例子。
第一行输入两个数N(1<N<10000),M(1<M<1000000). N表示參与打架的人数,M表示M次攻击。

接下来M行输入两个整数a, b (1<=a, b<=N),表示a攻击了b。

Output

若一定存在猪一样的队友输出YES, 否则输出NO。每一个输出占一行。

Sample Input

3 3
1 2
2 3
1 3

4 2
1 2
3 4

Sample Output

YES
NO

HINT

a攻击b且b攻击c 则可判断 a,c同伙,若a攻击c则有矛盾,即必定存在误伤。

Source

tyh

解析:參见ACdream 1056 Bad Horse (种类并查集)

AC代码:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 10005;

int f[2 * maxn + 2];

int Find(int x){
return x == f[x] ?

x : f[x] = Find(f[x]);
}

void unin(int x, int y){
x = Find(x);
y = Find(y);
if(x != y) f[x] = y;
}

int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif // sxk

int n, m, a, b;
while(~scanf("%d%d", &n, &m)){
for(int i=1; i<=2 * maxn; i++) f[i] = i;
int flag = 0;
for(int i=0; i<m; i++){
scanf("%d%d", &a, &b);
if(Find(a) == Find(b) || Find(a + maxn) == Find(b + maxn))
flag = 1;
else{
unin(a, b + maxn);
unin(a + maxn, b);
}
}
puts(flag ?

"YES" : "NO");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: