HLJU 1042 Fight (种类并查集)
2015-06-12 21:30
323 查看
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; }
相关文章推荐
- “渴了么”软件需求规格说明书
- [FZYZOJ 1200] 路由器安置
- ioctl错误引出的open和fopen的区别
- drp错误集锦---“Cannot return from outside a function or method”
- Precision/Recall和ROC曲线与分类
- Ubuntu 安装mysql和简单操作
- ios 获取 crash 日志
- 回车、换行、空格的ASCII码值—(附ASCII码表)
- 在VS上配置OpenCV
- Binary XML file line #7: Error inflating class fragment
- C++ Primer学习2:细节:引用
- dom4j 常用操作
- 对数据库中的元素增加约束
- 迷茫当中
- Spring格式化注解
- java中HashMap重要性质和优化总结
- JAVA线程
- leetcode系列题目——Set Matrix Zeroes
- LawOfLargeNumbers
- Task 6.4 冲刺Two之站立会议10