codevs 2639 约会计划
2639 约会计划
题目描述 Description
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'
第一行为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
0<m<=2008
0<p<=2008
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/
简单的并查集的题目,只不过需要增加一个存储名字的数组和一个查找名字的函数而已。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 typedef struct mm// 我定义了一个结构体来存储名字和朋友头领的下标 4 { 5 char name[12]; 6 int preNumb; 7 }mm; 8 mm a[2009]; 9 int n,m,p; 10 int F(char *s)// 寻找所输入名字所对应朋友的下标 11 { 12 int i; 13 for(i=0;i<n;i++) 14 if(strcmp(a[i].name,s)==0) break; 15 return i; 16 } 17 int find(int node)// 寻找朋友头领的下标 18 { 19 int r=node,i=node,j; 20 while(r!=a[r].preNumb) r=a[r].preNumb; 21 while(a[i].preNumb!=r)// 路径压缩,将各个朋友的头领均设置为r 22 { 23 j=a[i].preNumb; 24 a[i].preNumb=r; 25 i=j; 26 } 27 return r; 28 } 29 void mix(int node1,int node2)// 将朋友1和朋友2以及他们所在的朋友圈合并 30 { 31 int pre1=find(node1),pre2=find(node2); 32 if(pre1!=pre2) a[pre2].preNumb=pre1; 33 } 34 int main() 35 { 36 int i,node1,node2; 37 char s1[12],s2[12]; 38 scanf("%d%d%d",&n,&m,&p);getchar(); 39 for(i=0;i<n;i++) 40 { 41 scanf("%s",a[i].name); 42 getchar(); 43 a[i].preNumb=i; 44 } 45 for(i=0;i<m;i++) 46 { 47 scanf("%s %s",s1,s2); 48 getchar(); 49 node1=F(s1);node2=F(s2); 50 mix(node1,node2); 51 } 52 while(p--) 53 { 54 scanf("%s %s",s1,s2); 55 getchar(); 56 if(a[find(F(s1))].preNumb==a[find(F(s2))].preNumb) printf("safe\n"); 57 else printf("cc cry\n"); 58 } 59 return 0; 60 }
嘿嘿,以后就可以和别人吹牛说自己“约会”过了~
浙公网安备 33010602011771号