|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<bits/stdc++.h>
using namespace std;
int k,n,f[100010],x[100010],sum=0;
bool visit[100010];
bool vis[100010];
vector<pair<int,int>>g[100010];
vector<int>cha[100010];
int d[100050],ans[101000];
int find(int x){
if(f[x]==x){
return x;
}
return f[x]=find(f[x]);
}
void dfs(int x){
for(int i=0;i<g[x].size();i++){
d[g[x][i].first]+=g[x][i].second+d[x];
dfs(g[x][i].first);
}
}
void targan(int u){
visit[u]=true;
for(int i=0;i<g[u].size();i++){
if(!visit[g[u][i].first]){
targan(g[u][i].first);
f[g[u][i].first]=u;
}
}
for(int i=0;i<cha[u].size();i++){
if(visit[cha[u][i]]){
ans[sum++]=d[cha[u][i]]+d[u]-2*d[find(u)];
}
}
}
int main()
{
cin>>n>>k;
int a,b,w;
for(int i=1;i<n;i++){
cin>>a>>b>>w;
g[a].push_back({b,w});
g[b].push_back({a,w});
}
for(int i=1;i<=k;i++){
cin>>x[i];
}
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
vis[i]=true;
for(int i=1;i<k;i++){
if(!vis[i]&&!vis[i+1]){
cha[x[i]].push_back(x[i+1]);
cha[x[i+1]].push_back(x[i]);
}
else if(!vis[i]&&vis[i+1]){
cha[x[i]].push_back(x[i+2]);
cha[x[i+2]].push_back(x[i]);
i++;
}
else if(vis[i]&&!vis[i+1]){
cha[x[i+1]].push_back(x[i+2]);
cha[x[i+2]].push_back(x[i+1]);
i++;
}
}
}
dfs(1);
targan(1);
for(int i=0;i<sum;i++){
cout<<ans[i]<<' ';
}
return 0;
} |
|