题目描述
给你一个有向图的所有顶点有序对,顶点用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;
}


被折叠的 条评论
为什么被折叠?



