可以看成floyd,用bool变量标记公司

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<set>
 4 using namespace std;
 5 bool ss[300][300][30];
 6 void floyd(int n)
 7 {
 8     for(int k=1;k<=n;k++)
 9     {
10         for(int i=1;i<=n;i++)
11         {
12             if(ss[i][k][26])
13             {
14                 for(int j=1;j<=n;j++)
15                 {
16                     for(int t=0;t<26;t++)
17                         if(ss[i][k][t]&&ss[k][j][t])
18                         {
19                             ss[i][j][26]=ss[i][j][t]=true;
20                         }
21                 }
22             }
23         }
24     }
25 }
26 int main()
27 {
28     int n;
29     while(scanf("%d",&n)&&n)
30     {
31         memset(ss,false,sizeof(ss));
32         int a,b;
33         char s[30];
34         while(scanf("%d%d",&a,&b)&&a&&b)
35         {
36             scanf("%s",s);
37             for(int i=0;s[i];i++)
38                 ss[a][b][s[i]-'a']=true;
39             ss[a][b][26]=true;
40         }
41         floyd(n);
42         while(scanf("%d%d",&a,&b)&&a&&b)
43         {
44             if(!ss[a][b][26])
45             {
46                 printf("-\n");
47             }
48             else
49             {
50                 for(int i=0;i<26;i++)
51                     if(ss[a][b][i])
52                         putchar(char(i+'a'));
53                 printf("\n");
54             }
55         }
56         printf("\n");
57     }
58     return 0;
59 }