Files
Data-Structure/Algorithm/Graph/Floyd两点之间最短路径.cpp
2025-09-21 12:21:50 +08:00

38 lines
828 B
C++

#include <iostream>
#include <vector>
#include <tuple>
using namespace std;
const int INF = 100001;//别爆
int main(){
//dp的分阶段依据总写在最外层(最优子结构和重叠子问题的子问题分段)
int n, edge_num, start, end;
cin >> n >> edge_num >> start >> end;
//相关存储
//vector<tuple<int, int, int>> edge(edge_num);
vector<vector<int>> dp(n, vector<int>(n, INF));
for(int i = 0; i < edge_num; i++){
int a, b, w;
cin >> a >> b >> w;
//edge[i] = {a, b, w};
dp[a][b] = w;
}
//dp, 一定把k写最外面
for(int k = 0; k < n; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
}
}
}
for(int k = 0; k < n; k++){
if(dp[k][k] < 0){
cout << "Negative Cycle Detected!" << endl;
return 0;
}
}
cout << dp[start][end] << endl;
return 0;
}