最短路之dijkstra

来源:互联网 发布:木工展开面积快速算法 编辑:程序博客网 时间:2024/06/13 06:53

dijkstra是处理最短路的最基础的一个方法,只能做无负值边并且是单源最短路。大致是每次找到未进入集合的最短路点,然后用这个点更新路径,并将此点加入集合。

hdu2544

#include<iostream>#include<string.h>using namespace std;const int MAXN=120;const int MAX_INT=0x3fffffff;int n,m,i,j,u,v,l,h;int p[MAXN];//标记是否进入最短路的集合中int dist[MAXN];//源点到当前点的最短距离int a[MAXN][MAXN];//矩阵记录两点之间的路径void dijkstra(){    memset(p,0,sizeof(p));    u=1;    for (i=1;i<=n;i++)        dist[i]=a[u][i];    dist[u]=0; p[u]=1;    for (i=1;i<=n;i++)    {        h=0;        for (j=1;j<=n;j++)        if (dist[j]<dist[h]&&!p[j]) h=j;//找到未加入集合的最短路点        p[h]=1;//加入集合        for (j=1;j<=n;j++)//更新路径        if (dist[h]+a[h][j]<dist[j])        dist[j]=dist[h]+a[h][j];    }}int main(){    while(cin>>n>>m&&(n!=0||m!=0))    {        for (i=0;i<=n;i++) dist[i]=MAX_INT;        for (i=1;i<=n;i++)            for (j=1;j<=n;j++) a[i][j]=MAX_INT;//初始化        for (i=1;i<=m;i++)        {           cin>>u>>v>>l;           if (l<a[u][v])           {               a[u][v]=a[v][u]=l;           }        }        dijkstra();        cout<<dist[n]<<endl;    }}


0 0