【问题描述】
给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源(默认源点为顶点1)。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。
【输入形式】
第一行是顶点数n和边数m
随后n行是顶点编号
随后m行是所有边的起点 终点和边长
【输出形式】
输出n-1行,分别为源点到其他各点的最短路径
【样例输入】
5 6
1
2
3
4
5
1 2 5
2 5 1
1 3 2
3 4 3
4 5 2
1 4 1
【样例输出】
5
2
1
3
本题用了Floyd算法,但用dj其实会更快
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
const int inf=1e7+9;
int n,m;
int g[N][N];
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j] > g[i][k]+g[k][j]) g[i][j] = g[i][k]+g[k][j];
}
}
}
for(int i=2;i<=n;i++) cout<<g[1][i]<<endl;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int idx;
cin>>idx;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
g[i][j]=inf;
}
}
for(int i=0;i<m;i++)
{
int x,y,v;
cin>>x>>y>>v;
g[x][y]=v;
}
floyd();
}