单源最短路径问题 Dijkstra算法

算法原理部分在这就不多说了,其思想就是以起始点为中心向外层层扩展,直到扩展到终点为止。

该算法要求图中不存在负权边。

模板如下:


s【】表示该点是否已经计算出对应的dist【】, 是为true,否则为false;

dist【i】表示起始点到i点的距离;

ans【i】【j】表示点i到点j的距离,如果i,j不相邻,则为无穷大;

#define INF 999999999
#define MAX 10005
using namespace std;
bool s[MAX];
int dist[MAX],ans[MAX][MAX];
void Dijkstra(int n,int v)//传入顶点数n和起始点v
{
    int newdist,temp,u,i,j;
    for(i=1;i<=n;i++)
    {
        dist[i]=ans[v][i];
        s[i]=false;
    }
    dist[v]=0;
    s[v]=true;
    for(i=2;i<=n;i++)
    {
        temp=INF;
        u=v;
        for(j=1;j<=n;j++)
          if((!s[j])&&(dist[j]<temp))
          {
              u=j;
              temp=dist[j];
          }
        s[u]=true;
        for(j=1;j<=n;j++)
          if((!s[j])&&(ans[u][j]<INF))
          {
              newdist=dist[u]+ans[u][j];
              if(newdist<dist[j])  dist[j]=newdist;
          }
    }

}




HDU2544 最短路:

#include <cstdio>
#include <iostream>
#define INF 999999999
#define MAX 10005
using namespace std;
int s[MAX];
int dist[MAX],ans[MAX][MAX];
void Dijkstra(int n,int v)
{
    int newdist,temp,u,i,j;
    for(i=1;i<=n;i++)
    {
        dist[i]=ans[v][i];
        s[i]=0;
    }
    dist[v]=0;
    s[v]=1;
    for(i=1;i<=n;i++)
    {
        temp=INF;
        u=v;
        for(j=1;j<=n;j++)
          if((!s[j])&&(dist[j]<temp))
          {
              u=j;
              temp=dist[j];
          }
        s[u]=1;
        for(j=1;j<=n;j++)
          if((!s[j])&&(ans[u][j]<INF))
          {
              newdist=dist[u]+ans[u][j];
              if(newdist<dist[j])  dist[j]=newdist;
          }
    }
}
int main()
{
    int m,n;
    int a,b,t;
    while(scanf("%d%d",&n,&m))
    {
        if(m==0&&n==0)  break;
        for(int i=0;i<=n;i++)
          for(int j=0;j<=n;j++)
            ans[i][j]=INF;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&t);
            ans[a][b]=t;
            ans[b][a]=t;
        }
        Dijkstra(n,1);
        printf("%d\n",dist[n]);
    }
    return 0;
}


你可能感兴趣的:(单源最短路径问题 Dijkstra算法)