给出两个点,后跟几个字母,一个字母表示一个公司,然后两个点表示此公司连接此俩点
最后给出连个点,问你连接的公司有哪些?并且此图是有向图
根据问题描述,应该是求全员最短路径问题,目前根据所学的只能用Floyd算法了吧,还有这次不是单纯的floy,否则超时,因此需要剪枝一下
此外,floyd算法我一直忽视一个问题就是它竟然跟循环的顺序还有一定关系
for(i to n)
for(j to n)
for(k to n)
if(map[j][i]&&map[i][k])map[j][k]=1 不知道有时候可以通过,有时候就失败,回头总结下原因,此题先上代码吧
1 #include <stdio.h>
2 #include <string.h>
3 int map[300][300][30];
4 int main()
5 {
6 int n,n1,n2;
7 char com[30];
8 while(scanf("%d",&n)!=EOF&&n)
9 {
10 memset(map,0,sizeof(map));
11 while(scanf("%d%d",&n1,&n2)!=EOF&&n1&&n2)
12 {
13 scanf("%s",com);
14 for(int i=0;i<strlen(com);i++)
15 map[n1][n2][com[i]-'a']=1;
16 }
17 /*for(int i=0;i<26;i++)
18 for(int j=1;j<=n;j++)
19 for(int k=1;k<=n;k++)
20 for(int l=1;l<=n;l++)
21 if(map[j][l][i]&&map[k][j][i])
22 map[k][l][i]=1;*/
23 for(int i=0;i<26;i++)
24 for(int j=1;j<=n;j++)
25 for(int k=1;k<=n;k++)
26 if(map[k][j][i])//剪枝
27 {
28 for(int l=1;l<=n;l++)
29 if(map[j][l][i])map[k][l][i]=1;
30
31 }
32
33
34
35
36 while(scanf("%d%d",&n1,&n2)!=EOF&&n1&&n2)
37 {
38 int flag=0;
39 for(int i=0;i<26;i++)
40 if(map[n1][n2][i])
41 {printf("%c",'a'+i);flag=1;}
42 if(flag==0)printf("-");
43 printf("\n");
44 }
45 printf("\n");
46 }
47
48
49
50 }
51