思想:每次找到离原点最近的顶点,以这个点为中心扩展松弛,更新其余点到原点的最短路径.
注意:if(e[u][v]>x)e[u][v]=x;
book[ ]数组标记最短路程的顶点集合
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000+5
using namespace std;
//单元最短路径(x到任意一点的最短路径)
int e[N][N],dis[N],n,m;
void dijskra(int x)
{
int book[N];
for(int i=0;i<=n;i++)
dis[i]=e[x][i];//初始dis数组
memset(book,0,sizeof(book));
book[x]=1;
for(int i=1;i<=n-1;i++)//n-1次松弛
{
int minn=0x3f3f3f3f,u;
for(int j=1;j<=n;j++)//找到最短的dis路径
{
if(!book[j]&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
book[u]=1;
for(int v=1;v<=n;v++)
{
if(dis[v]>dis[u]+e[u][v])//松弛
dis[v]=dis[u]+e[u][v];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(e,0x3f3f3f3f,sizeof(e));
for(int i=0;i<=n;i++)
e[i][i]=0;
int u,v,len;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&len);
if(e[u][v]>len)
e[u][v]=e[u][v]=len;
}
dijskra(1);
return 0;
}