赞
踩
#include <iostream> #include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+10; typedef pair<int,int>pii; map<pii, int>st;//记录从{x,y}的距离是多少 int a[N];//存储原始路径 vector<pii>edge[N];//存图 // s表示你要求的路径的起点 // v表示你要求的路径的终点 //u表示你当前走到了哪个点 //father表示你当前这个点的父亲节点是谁。避免重复走造成死循环。 // sum表示从s走到u的路径花费总和。 bool dfs(int s,int u,int father,int v,int sum) { if(u==v){ st[{s,v}]=sum; st[{v,s}]=sum; return true; } for(int i=0;i<edge[u].size();i++) { int son=edge[u][i].first; if(son==father) continue; int w=edge[u][i].second; if(dfs(s,son,u,v,sum+w)) return true; } return false; } void sovle() { int n,k; cin>>n>>k; for(int i=0;i<n-1;i++) { int x,y,t; cin>>x>>y>>t; edge[x].push_back({y,t}); edge[y].push_back({x,t}); } for(int i=0;i<k;i++) cin>>a[i]; int ans=0; //总花费 for(int i=0;i<k-1;i++) { dfs(a[i],a[i],-1,a[i+1],0); ans+=st[{a[i],a[i+1]}]; } //跳过某个景点的花费 for(int i=0;i<k;i++) { int tmp=ans; if(i==0) tmp-=st[{a[i],a[i+1]}]; else if(i==k-1) tmp-=st[{a[i-1],a[i]}]; else { tmp-=st[{a[i-1],a[i]}]; tmp-=st[{a[i],a[i+1]}]; dfs(a[i-1],a[i-1],-1,a[i+1],0); tmp+=st[{a[i-1],a[i+1]}]; } cout<<tmp<<" "; } } signed main() { // DFS遍历 ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t=1; //cin>>t; while(t--) sovle(); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。