void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出两个点,后跟几个字母,一个字母表示一个公司,然后两个点表示此公司连接此俩点

最后给出连个点,问你连接的公司有哪些?并且此图是有向图

根据问题描述,应该是求全员最短路径问题,目前根据所学的只能用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
posted on 2011-04-21 22:31  void-man  阅读(441)  评论(0)    收藏  举报