【POJ】1703 Find them, Catch them 并查集
2017-01-22 16:57
309 查看
Find them, Catch them
poj 1703 http://poj.org/problem?id=1703Time Limit: 1000MS Memory Limit: 10000K Total
Submissions: 43420 Accepted: 13356
Description
The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present question is, given two criminals; do they belong to a same clan? You must give your judgment based on incomplete information. (Since the gangsters are always acting secretly.)Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
Input
The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. Each test case begins with a line with two integers N and M, followed by M lines each containing one message as described above.Output
For each message “A [a] [b]” in each case, your program should give the judgment based on the information got before. The answers might be one of “In the same gang.”, “In different gangs.” and “Not sure yet.”Sample Input
15 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
Sample Output
Not sure yet.In different gangs.
In the same gang.
题解
用一个val[]记录元素在集合中的类型,考察了对并查集压缩路径的过程。//对并查集还不了解的可以看我上一篇文章,可以借那个题理解理解http://blog.csdn.net/ctsas/article/details/54647581
由于类型只有两种,就用bool val[]了。
#include<stdio.h> #define MAX_N 100005 int par[MAX_N];bool val[MAX_N]; void init(int n){ for(int i=0;i<=n;i++) par[i]=i,val[i]=false; } int find(int x){ if(par[x]==x) return x; int t=find(par[x]); val[x]=val[par[x]]?!val[x]:val[x]; return par[x]=t; } void unite(int x,int y){ int a=find(x); int b=find(y); val[b]=val[y]==val[b]?!val[x]:val[x]; par[b]=a; } int main() { int T,n,m,x,y;char op[2]; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(n); while(m--){ scanf("%s%d%d",op,&x,&y); if(*op=='A'){ if(find(x)!=find(y)) puts("Not sure yet."); else puts(val[x]==val[y]?"In the same gang.":"In different gangs."); } else unite(x,y); } } return 0; }
e786
相关文章推荐
- OSGi依赖性管理:Bundle访问域
- Java 中 byte、byte 数组和 int、long 之间的转换
- 数组基础
- 下面这段代码实在还原不过来请赐教
- 抓包工具Fiddler的使用教程(十一):如何知道HTTP请求是POST方法还是GET方法
- 2元寻ASP程序员修正网站几个小错误
- windows telnet开启
- ASP通过Jmail能不能同时发送多个邮件
- 掌握jQuery插件开发
- Solr中的日期/时间表示
- 《线性代数》——读书笔记1
- org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML doc
- iOS拨打电话
- 【Leetcode】492. Construct the Rectangle
- sping 乱码
- bzoj 1532: [POI2005]Kos-Dicing (二分+最大流)
- LeetCode 492. Construct the Rectangle
- JVM系列-常用问题
- Quartz.NET 入门
- Web 环境设置