单元最短路 Dijkstra算法解决,数据范围较小,朴素版即可解决O(n²)(因为我只会朴素版)
#include<bits/stdc++.h>
#include <vector>
using namespace std;
#define int long long
const int INF=1e18;
void solve(){
int n,m;cin>>n>>m;
vector<vector<int>> val(n+1,vector<int>(n+1,INF)),val2(n+1,vector<int>(n+1,INF));
vector<int> d(n+1,INF),d2(n+1,INF);
vector<bool> vis(n+1,false),vis2(n+1,false);
d[1]=d2[1]=0;
while(m--){
int u,v,w;cin>>u>>v>>w;
val[u][v]=w;
val2[v][u]=w;
}
for(int i=1;i<=n;i++){
int u=-1,minn=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&d[j]<minn){
u=j;
minn=d[j];
}
}
if(u==-1) break;
vis[u]=true;
for(int k=1;k<=n;k++){
if(!vis[k]&&val[u][k]<INF){
d[k]=min(d[k],d[u]+val[u][k]);
}
}
}
for(int i=1;i<=n;i++){
int u=-1,minn=INF;
for(int j=1;j<=n;j++){
if(!vis2[j]&&d2[j]<minn){
u=j;
minn=d2[j];
}
}
if(u==-1) break;
vis2[u]=true;
for(int k=1;k<=n;k++){
if(!vis2[k]&&val2[u][k]<INF){
d2[k]=min(d2[k],d2[u]+val2[u][k]);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=d[i]+d2[i];
}
cout<<ans;
}
signed main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int t=1;
// cin>>t;
while(t--){
solve();
}return 0;
}

京公网安备 11010502036488号