标签:frame vertica use names OLE opened 一个 fine 3.2
for(each v∈son[u]) do
if(vis[v]=true)then vis[u]=true;
x
using namespace std;
struct edge{
int to,dis,next;
edge(){}
edge(const int &_to,const int &_dis,const int &_next){
to=_to,dis=_dis,next=_next;
}
}e[maxn<<1];
int head[maxn],k;
bool vis[maxn];
int dep[maxn],a[maxn],val[maxn];
int n,m,s;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<‘0‘||‘9‘<c){ if(c==‘-‘) f=-1; c=getchar(); }
while(‘0‘<=c&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
inline void add(const int &u,const int &v,const int &w){
e[k]=edge(v,w,head[u]);
head[u]=k++;
}
void dfs(int u,int pre){
for(register int i=head[u];~i;i=e[i].next){
int v=e[i].to;
if(v==pre) continue;
dep[v]=dep[u]+1;
dfs(v,u);
if(vis[v]) vis[u]=true;
}
}
void dfs2(int u,int pre){
for(register int i=head[u];~i;i=e[i].next){
int v=e[i].to;
if(v==pre) continue;
dep[v]=dep[u]+e[i].dis;
dfs2(v,u);
}
}
int main(){
memset(head,-1,sizeof head);
n=read(),s=read();
for(register int i=1;i<n;i++){
int u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
}
m=read();
for(register int i=1;i<=m;i++){
a[i]=read(),vis[a[i]]=true;
}
dfs(s,0);
for(register int i=0;i<k;i+=2){
int u=e[i].to,v=e[i^1].to;
if(dep[u]>dep[v]) swap(u,v);
val[v]=e[i].dis;
}//把边权赋给点权
long long ans=0;
for(register int i=1;i<=n;i++) if(vis[i]){
ans+=val[i];
}
memset(dep,0,sizeof dep);
dfs2(s,0);
int maxdep=0;
for(register int i=1;i<=n;i++) if(vis[i]){
maxdep=max(maxdep,dep[i]);
}
printf("%d\n",ans*2-maxdep);
return 0;
}
标签:frame vertica use names OLE opened 一个 fine 3.2
原文地址:https://www.cnblogs.com/akura/p/10809540.html