pku 2387

pku 2387

 2009年7月24日

题目链接:PKU 2387 Til the Cows Come Home

分类:简单最短路

题目分析与算法原型
         这道题也是一道较简单的最短路径问题,不过这题目有重边(看了讨论才知道),意思是说输入的路径中,存在一些起点和终点都相同但长度却不同的 路径,这个时候只要保存最小的长度作为权值即可,其他没什么,Dijkastra就行了

Code:

 1
#include < stdio.h >
 2 #include < string .h >
 3 #define  len 1005
 4 #define  max 0x7fffffff
 5
 6 int  t,n,i,j,map[len][len],dis[len],flag[len],u;
 7
 8 void  dij( int  v0)
 9 {
10    for(i=1;i<=n;i++)dis[i]=map[v0][i];
11    flag[v0]=1;
12    for(i=1;i<n;i++)
13    {
14        int min=max;
15        for(j=1;j<=n;j++)
16            if(flag[j]==0&&dis[j]<min)
17            {
18                u=j;
19                min=dis[j];
20            }

21        if(min==max)return;
22
23        flag[u]=1;
24        for(j=1;j<=n;j++)
25            if(flag[j]==0&&map[u][j]<max&&dis[u]+map[u][j]<dis[j])
26                dis[j]=dis[u]+map[u][j];
27    }

28
29}

30
31 void  init()
32 {
33    for(i=1;i<=n;i++)
34        for(j=1;j<=n;j++)
35        {
36            if(i==j)map[i][j]=0;
37            else map[i][j]=max;
38        }

39}

40
41 int  main()
42 {
43    while(scanf("%d%d",&t,&n)!=EOF)
44    {
45        int a,b,l;
46        init();
47        memset(flag,0,sizeof(flag));
48        for(i=0;i<t;i++)
49        {
50            scanf("%d%d%d",&a,&b,&l);
51            if(l<map[a][b])
52            {
53                map[a][b]=l;
54                map[b][a]=l;
55            }

56        }

57        dij(n);
58        printf("%d\n",dis[1]);
59    }

60    return 0;
61}

62

你可能感兴趣的:(pku 2387)