#include <climits>
#include<iostream>
#include<vector>
#include<array>
#include<algorithm>
#include<functional>
#include<queue>
#include <bitset>
using ll = long long;
int n,m;
const int N = 1e3 + 7;
struct edge{
int v;ll w;
edge(int _v = 0,ll _w = 0):v(_v),w(_w){}
bool operator < (const edge&u)const{
return u.w < w;
}
};
std::bitset<N>vis;
signed main(){
std::cin >> n >> m;
std::vector<std::vector<edge>>g(n + 1),rg(n + 1);
for(int i = 0;i < m; ++i){
int u,v;ll w;
std::cin >> u >> v >> w;
g[u].emplace_back(v,w);
rg[v].emplace_back(u,w);
}
auto dijkstra = [&](int st,const std::vector<std::vector<edge>>&graph){
std::vector<int>d(n + 1,INT_MAX / 2);
vis.reset();
d[st] = 0;
std::priority_queue<edge>hp;
hp.emplace(st,d[st]);
while(hp.size()){
auto [u,nd] = hp.top();
hp.pop();
if(vis[u])continue;
vis[u] = 1;
for(auto [v,w]:graph[u]){
if(d[v] > d[u] + w){
d[v] = d[u] + w;
hp.push({v,d[v]});
}
}
}
return d;
};
auto d1 = dijkstra(1,g);
auto d2 = dijkstra(1,rg);
ll ans = 0;
for(int i = 1;i <= n; ++i){
ans += d1[i] + d2[i];
}
std::cout << ans << '\n';
}
此处确保两两可达,并且要求往返都要跑一趟,直接跑正反图dijkstra就行。

京公网安备 11010502036488号