最短路之dijkstra

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;
    }
}


發佈了36 篇原創文章 · 獲贊 3 · 訪問量 8143
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章