1. 程式人生 > >poj2387(最簡單的最短路)

poj2387(最簡單的最短路)

此題是最簡單的短路,告訴你邊數m,點數n,接下來m行點,點,距離,求1~n的最短距離

但是要考慮重邊(wa了兩次看題解才發現這個坑...),即2到3可能不止一條路,只需記錄最短的那條路,我用迪傑斯特拉

#include <stdio.h>
#include <string.h>
int dis[1005];
int s[1005][1005];
int book[1005],min;
 int main()
 {
     int n,m,i,j,a,b,c,u,k;
     memset(dis,0,sizeof(dis));
     memset(book,0,sizeof(book));
     scanf("%d%d",&m,&n);
     for (i=0;i<=n;i++)
        for (j=0;j<=n;j++)
         if (i==j)
         s[i][j]=0;
     else
         s[i][j]=99999999;
     for (i=1;i<=m;i++)
     {
         scanf("%d%d%d",&a,&b,&c);
         if (c<s[a][b])
         {
         s[a][b]=c;
         s[b][a]=c;
         }
     }
     for (i=2;i<=n;i++)
        dis[i]=s[1][i];
        book[1]=1;
     for (i=1;i<=n-1;i++)
     {
         min=99999999;
         for (j=1;j<=n;j++)
         if ((min>dis[j])&&(!book[j]))
         {
             min=dis[j];
             u=j;
         }
         book[u]=1;
         for (k=1;k<=n;k++)
            if (dis[u]+s[u][k]<dis[k])
         {
             dis[k]=dis[u]+s[u][k];
         }
     }
     printf("%d\n",dis[n]);
     return 0;

 }