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 }

 

你可能感兴趣的:(OJ)