打一个dj的模板,方便以后查阅
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX=1e9;
int n,m;
int a[1005][1005];//图
int lowcost[1005];
int vis[1005];
void dj(int s)
{
for(int i=1;i<=n;i++)//3.初始化每个点到指定点的最短路径
{
lowcost[i]=a[i][s];
}
memset(vis,0,sizeof vis);
vis[s]=1;
for(int i=1;i<n;i++)//4.依次选出最短路径的点,总共n-1个,循环n的话也没关系
{
int MIN,min_index;
MIN=MAX;
min_index=i;
for(int j=1;j<=n;j++)//4.1找出最短路径的点以及下标
{
if(MIN>lowcost[j] && !vis[j])
{
MIN=lowcost[j];
min_index=j;
}
}
vis[min_index]=1;
for(int k=1;k<=n;k++)//4.2更新一下每个点到指定点的最短距离
if(lowcost[k]>lowcost[min_index]+a[min_index][k] && !vis[k])
lowcost[k]=lowcost[min_index]+a[min_index][k];
}
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
for(int i=1;i<=n;i++)//0.初始化矩阵
for(int j=1;j<=n;j++)
{a[i][j]=i==j?0:MAX;}
int x,y,val;
for(int i=0; i<m; i++)//1.构造邻接矩阵
{
scanf("%d%d%d",&x,&y,&val);
a[x][y]=a[y][x]=val;
}
dj(2);
//5.到各个点的最短路径存在lowcost中
for(int i=1;i<=n;i++)
printf("%d \n",lowcost[i]);
}
return 0;
}