#include<bits/stdc++.h> using namespace std; int n,m; int dis[1003],dis1[1003]; struct node { int val,to; bool operator < (const node & S) const { return val>S.val; } }; vector<node> V[1003],VV[1003]; void dij(int a) { for(int i=1;i<=n;i++) dis[i]=1e9; // dis[1]=0; priority_queue<node> q; q.push(node{0,1}); while(q.size()) { node top=q.top(); q.pop(); if(dis[top.to]<top.val) continue; dis[top.to]=top.val; for(auto T:V[top.to]) { if(dis[T.to]>dis[top.to]+T.val) { dis[T.to]=dis[top.to]+T.val; q.push(node{dis[T.to],T.to}); } } } } void dij1(int a) { for(int i=1;i<=n;i++) dis1[i]=1e9; // dis[1]=0; priority_queue<node> q; q.push(node{0,1}); while(q.size()) { node top=q.top(); q.pop(); if(dis1[top.to]<top.val) continue; dis1[top.to]=top.val; for(auto T:VV[top.to]) { if(dis1[T.to]>dis1[top.to]+T.val) { dis1[T.to]=dis1[top.to]+T.val; q.push(node{dis1[T.to],T.to}); } } } } int main() { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); V[u].push_back(node{w,v}); VV[v].push_back(node{w,u}); } dij(1); dij1(1); int sum=0; for(int i=2;i<=n;i++) { // printf("%d %d\n",dis[i],dis1[i]); sum+=dis[i]+dis1[i]; } printf("%d\n",sum); }
最短路模板
于 2023-06-03 21:17:25 首次发布