码迷,mamicode.com
首页 > 其他好文 > 详细

HLJU 1042 Fight (种类并查集)

时间:2015-06-12 22:17:53      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

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




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



HLJU 1042 Fight (种类并查集)

标签:

原文地址:http://blog.csdn.net/u013446688/article/details/46475691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!