Malefic

未待满塘荷开盛,已闻浊名酒泛香。

导航

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'

输入描述 Input Description

第一行为n,m,p。n为mm的数量,cc知道m对朋友关系,有p次约会。
2到n+1 行,每行一个字符串,为第i个mm的名字。{字符串长度<=11,且全大写}
以下m行,每行两个字符串,用空格隔开 ,为有朋友关系的两个mm的名字。
以下p行,每行为两个字符串,用空格隔开,为这p次约会中两个mm的名字。
{保证数据不会出现没有出现过的名字}

输出描述 Output Description

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

样例输入 Sample Input

3 1 1
AAA
BBB
CCC
AAA CCC
AAA BBB

样例输出 Sample Output

cc cry

数据范围及提示 Data Size & Hint

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 }
View Code

 

嘿嘿,以后就可以和别人吹牛说自己“约会”过了~

 

 

posted on 2017-07-19 15:15  Malefic  阅读(138)  评论(0)    收藏  举报