又是一道最短路基础题目,注意两点就可以了:
1.输入的时候可能会两点之间有多条路,选最短的存起来。
2.判断有没有路径存在,可以判断一下终点到起点的距离是否小于原来初始化的最大值,如果是就输出结果,否则输出-1
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set> #include<string> #include<algorithm> #define MAX 10010000 using namespace std; int d[205]; int gra[205][205]; int visit[205]; int n,m,s,t; void dijkstra() { int i,j; for(i=0; i<n; i++) d[i] = MAX; d[s] = 0; memset(visit,0,sizeof(visit)); for(i=0; i<n; i++) { int x ,y = MAX; for(j=0; j<n; j++) { if(!visit[j] && d[j] < y) y = d[x = j]; } visit[x] = 1; for(j=0; j<n; j++) if(!visit[j] && d[j]>d[x]+gra[x][j]) d[j] = d[x] + gra[x][j]; } return ; } int main() { int i,j,a,b,c; while(cin >> n >> m) { for(i=0; i<n; i++) for(j=0; j<n; j++) gra[i][j] = MAX; for(i=1; i<=m; i++) { cin >> a >> b >> c; if(gra[a][b] > c) gra[a][b] = gra[b][a] = c; } cin >> s >> t; dijkstra(); if(d[t] < MAX) cout << d[t] << endl; else cout << -1 << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2025-01-18 10:31:27