RQNOJ PID379 / 约会计划 -并查集

PID379 / 约会计划

题目描述

cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错。然而,最关键的是,cc能够很好的调解各各妹妹间的关系。mm之间的关系及其复杂,cc必须严格掌握她们之间的朋友关系,好一起约她们出去,cc要是和不是朋友的两个mm出去玩,后果不堪设想……

cc只掌握着一些mm之间的关系,但是cc比较聪明,他知道a和b是朋友,b和c 是朋友,那么a和c也是朋友。

下面给出m对朋友关系, cc 定了p次约会,每次约会找两个mm,如果这两个mm是朋友,那么不会出乱子,输出‘safe’,要是不是朋友,那么cc必然会挨……,输出‘cc cry’(T_T)。

【数据范围】

0<m<=2008

0<p<=2008

输入格式

第一行为n,m,p。n为mm的数量,cc知道m对朋友关系,有p次约会。

2到n+1 行,每行一个字符串,为第i个mm的名字。{字符串长度<=11,且全大写}

以下m行,每行两个字符串,用空格隔开 ,为有朋友关系的两个mm的名字。

以下p行,每行为两个字符串,用空格隔开,为这p次约会中两个mm的名字。

{保证数据不会出现没有出现过的名字}

输出格式

输出P行表示第i次约会的情况,输出‘safe’或者‘cc cry’

样例输入

3 1 1
AAA
BBB
CCC
AAA CCC
AAA BBB

样例输出

cc cry

水一下并查集。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<map>
 9 #include<stack>
10 using namespace std;
11 const int maxn=1e4+10;
12 int pre[maxn];
13 map<string,int>pos;
14 int find(int x){
15     int r=x;
16     while(pre[r]!=r)r=pre[r];
17     int i=x,j;
18     while(i!=r){
19         j=pre[i];
20         pre[i]=r;
21         i=j;
22     }
23     return r;
24 }
25 
26 void join(int x,int y){
27     int a=find(x);
28     int b=find(y);
29     if(a!=b)
30         pre[a]=b;
31 }
32 
33 int main(){
34     int n,m,p;
35     cin>>n>>m>>p;
36     for(int i=1;i<=n;i++)
37         pre[i]=i;
38     for(int i=1;i<=n;i++){
39         string a;
40         cin>>a;
41         pos[a]=i;
42     }
43     for(int i=1;i<=m;i++){
44         string a,b;
45         cin>>a>>b;
46         join(pos[a],pos[b]);
47     }
48     for(int i=1;i<=p;i++){
49         string a,b;
50         cin>>a>>b;
51         if(find(pos[a])!=find(pos[b]))
52             cout<<"cc cry"<<endl;
53         else
54             cout<<"safe"<<endl;
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/ZERO-/p/9492402.html