题目描述
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 }