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