dijkstra()模板

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int n,m,hash[1010],dis[1010],map[1010][1010];

const int inf=0x7fffffff;

void dijstra()

{

     dis[1]=0;

     for(int i=1;i<=n;i++)

     {

          int t=inf,pos;

          for(int j=1;j<=n;j++)//找出当前未标记的最小顶点

          {

              if(hash[j]==0)

              {

                  if(dis[j]<t)

                  {

                      t=dis[j];

                      pos=j;

                  }

              }

          }

          hash[pos]=1;

          if(pos==n)   break;//路径压缩

          for(int j=1;j<=n;j++)//不断更改值使之最小

          {

              if(hash[j]==0)

              {

                  if(map[pos][j]!=inf&&dis[pos]+map[pos][j]<dis[j])

                  {

                      dis[j]=dis[pos]+map[pos][j];

                  }

              }

          }

     }

}

int main()

{

    int a,b,val;

    while(scanf("%d%d",&n,&m)!=EOF)

    {

         for(int i=1;i<=n;i++)//初始化

         {

             hash[i]=0;

             dis[i]=inf;

             for(int j=1;j<=n;j++)

             {

                 map[i][j]=inf;        

             }

         }

         for(int i=1;i<=m;i++)//输入边对应的顶点及权值

         {

             scanf("%d%d%d",&a,&b,&val);

             if(val<map[a][b]&&a!=b)//注意此处不能丢,因为有可能输入相同的边对应于不同的权值,找最小的输入。

             {

                 map[a][b]=map[b][a]=val;

             }

         }

         dijstra();

         printf("%d\n",dis[n]);

    }

    system("pause");

    return 0;

}

你可能感兴趣的:(dijkstra)