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