pku 1125

2009年7月29日

题目链接:PKU 1125 Stockbroker Grapevine

题目分析与算法原型
        先用Floyd算出每对点之间的最短路径,然后记录每个点到其他点的n-1个最短路径中最长的那条路径长度保存在数组中,最后取该数组中最小(若最小的为max,则输出“disjoint”)的那个就ok了

Code:

 1
#include<stdio.h>
 2#define len 105
 3#define max 1000000000
 4
 5int map[len][len],n,dis[len];
 6
 7void init()
 8{
 9    int i,j;
10    for(i=1;i<=n;i++)
11        for(j=1;j<=n;j++)
12        {
13            if(i==j)map[i][j]=0;
14            else map[i][j]=max;
15        }

16}

17int main()
18{
19    int i,j,k;
20    while(scanf("%d",&n)!=EOF&&n)
21    {
22        init();
23        for(i=1;i<=n;i++)
24        {
25            int num,a,cost;
26            scanf("%d",&num);
27            for(j=1;j<=num;j++)
28            {
29                scanf("%d%d",&a,&cost);
30                map[i][a]=cost;
31            }

32        }

33        for(k=1;k<=n;k++)
34            for(i=1;i<=n;i++)
35                for(j=1;j<=n;j++)
36                    if(map[i][j]>map[i][k]+map[k][j])
37                        map[i][j]=map[i][k]+map[k][j];
38                    
39                    for(i=1;i<=n;i++)
40                    {
41                        int _max=-1;
42                        for(j=1;j<=n;j++)
43                            if(j!=i&&map[i][j]>_max)_max=map[i][j];
44                            dis[i]=_max;
45                    }

46                    int _min=max,res;
47                    for(i=1;i<=n;i++)
48                        if(dis[i]<_min)
49                        {
50                            _min=dis[i];
51                            res=i;
52                        }

53                        if(_min==max)printf("disjoint\n");
54                        else printf("%d %d\n",res,_min);
55    }

56    return 0;
57}

posted on 2009-07-29 19:16 蜗牛也Coding 阅读(230) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(8)

随笔档案(78)

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜