HDOJ1874(畅通工程续)

题目链接

求单源最短路的题,因为边权非负,所以可以用dijkstra。这题有一点需要注意的地方是有重边,在读数据时取较小的即可。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MIN(a,b)    ((a)<(b)?(a):(b))
 4 #define N 200
 5 #define INF 2000000
 6 int g[N][N];
 7 int dist[N];
 8 int n,m;
 9 char vis[N];
10 void dijkstra(int u)
11 {
12     int i,min,k,v;
13     memset(vis,0,sizeof(vis));
14     for(i=0;i<n;i++)    dist[i]=(i==u?0:INF);
15     for(i=0;i<n;i++)
16     {
17         min=INF;
18         for(v=0;v<n;v++)    if(!vis[v]&&dist[v]<=min)    min=dist[k=v];
19         vis[k]=1;
20         for(v=0;v<n;v++)    dist[v]=MIN(dist[v],dist[k]+g[k][v]);
21     }
22 }
23 int main()
24 {
25     int i,a,b,d,s,t;
26     while(~scanf("%d%d",&n,&m))
27     {
28         for(a=0;a<n;a++)
29         {
30             for(b=a+1;b<n;b++)    g[a][b]=g[b][a]=INF;
31         }
32         for(i=0;i<m;i++)    scanf("%d%d%d",&a,&b,&d),g[a][b]=g[b][a]=MIN(d,g[a][b]);
33         scanf("%d%d",&s,&t);
34         dijkstra(s);
35         if(dist[t]<INF) printf("%d\n",dist[t]);
36         else    printf("-1\n");
37     }
38     return 0;
39 }

 

posted @ 2012-04-20 23:06  BeatLJ  阅读(221)  评论(0编辑  收藏  举报