题目描述
给你一个有向图的所有顶点有序对,顶点用1~n编号,每个有序对描述有向边,请编程求解从1到任意一个顶端i的最短路径长度。
输入
第一行是n和m,分别表示顶点数(n<100)和有向边数(m<100)。
从第二行开始n行,对应三个数,前两个表示顶点有序对,第三个数表示边的权。
最后一行i,表示要求解从1到顶点i的最短路径长度。
输出
从1到顶点i的最短路径长度。
样例输入
4 5
1 2 4
1 3 6
2 3 1
3 4 6
2 4 7
3
样例输出
5
#include<bits/stdc++.h>
using
namespace
std;
const
int
N = 100;
int
n,m;
int
dist[N],g[N][N];
bool
st[N];
int
dijkstra(
int
ans)
{
memset
(dist,0x3f,
sizeof
dist);
dist[1] = 0;
for
(
int
i=0;i<ans-1;i++)
{
int
t = -1;
for
(
int
j=1;j<=ans;j++)
{
if
(!st[j]&&(t==-1||dist[t]>dist[j]))
t = j;
}
for
(
int
j = 1;j<=ans;j++)
{
dist[j] = min(dist[j],dist[t]+g[t][j]);
}
st[t] =
true
;
}
if
(dist[ans] == 0x3f3f3f3f)
return
-1;
return
dist[ans];
}
int
main()
{
cin>>n>>m;
memset
(g,0x3f,
sizeof
g);
while
(m--)
{
int
a,b,c;
cin>>a>>b>>c;
g[a][b] = min(g[a][b],c);
}
int
popurse;
cin>>popurse;
int
t = dijkstra(popurse);
cout<<t;
return
0;
}