1 solutions
-
1
将返回路径也搜一次即可(建一个反图即可)。
放代码:
#include<bits/stdc++.h> #define int long long #define D using namespace std;const int N=2e3+10; int e[N][N],er[N][N],d[N],dr[N];bool a[N][N],ar[N][N]; struct n_{int u,w;bool operator>(const n_&n)const{return w>n.w;}}; signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,m;cin>>n>>m; memset(e,0x3f,sizeof e);memset(er,0x3f,sizeof er); memset(d,0x3f,sizeof d);memset(dr,0x3f,sizeof dr); for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;e[u][v]=er[v][u]=min(w,e[u][v]);a[u][v]=ar[v][u]=1;} priority_queue<n_,vector<n_>,greater<n_>>q;n_ nd;nd.u=1;nd.w=0;d[1]=dr[1]=0;q.push(nd); while(!q.empty()){int u=q.top().u;q.pop(); for(int v=1;v<=n;v++)if(a[u][v]&&d[v]>d[u]+e[u][v]){d[v]=d[u]+e[u][v];q.push({v,d[v]});}} q.push(nd);while(!q.empty()){int u=q.top().u;q.pop(); for(int v=1;v<=n;v++)if(ar[u][v]&&dr[v]>dr[u]+er[u][v]){dr[v]=dr[u]+er[u][v];q.push({v,dr[v]});}} #ifdef D for(int i=1;i<=n;i++)cerr<<d[i]<<" ";cerr<<"\n"; for(int i=1;i<=n;i++)cerr<<dr[i]<<" ";cerr<<"\n"; #endif int ans=0;for(int v=2;v<=n;v++)ans+=d[v]+dr[v];cout<<ans; return 0; }
Information
- ID
- 5740
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 3
- Tags
- # Submissions
- 131
- Accepted
- 32
- Uploaded By