T了5,6,7,9四个点,评测记录,求调/kel
看了看好像大家都是因为把前向星memset
了才T的,可是我也没memset
,之前写了一份差不多的也过了,就很迷惑/kk
#include<stdio.h>
#include<algorithm>
using std::sort;
const int inf=0x7fffffff;
inline long long min(long long x,long long y){ return x<y?x:y; }
struct Graph
{
struct Edge
{
int v,w,next;
}e[2000002];
int ecnt,h[1000002];
inline void add_edge(int u,int v,int w=0)
{
e[++ecnt]={v,w,h[u]};
h[u]=ecnt;
e[++ecnt]={u,w,h[v]};
h[v]=ecnt;
}
}G,T;
int fa[1000002],dep[1000002],size[1000002];
int dfn[1000002],id[1000002],cnt;
long long dis[1000002];
namespace LCA//树剖lca
{
int son[1000002],top[1000002];
void dfs1(int u,int _fa,int _w)
{
fa[u]=_fa;
dep[u]=dep[fa[u]]+1;
dis[u]=min(dis[fa[u]],_w);
size[u]=1;
dfn[++cnt]=u,id[u]=cnt;
for(int i=G.h[u];i;i=G.e[i].next)
if(G.e[i].v!=fa[u])
dfs1(G.e[i].v,u,G.e[i].w),size[u]+=size[G.e[i].v],
son[u]=(size[G.e[i].v]>size[son[u]]?G.e[i].v:son[u]);
}
void dfs2(int u,int _top)
{
top[u]=_top;
if(son[u]) dfs2(son[u],_top);
for(int i=G.h[u];i;i=G.e[i].next)
if(G.e[i].v!=fa[u])
dfs2(G.e[i].v,G.e[i].v);
}
inline void swap(int &x,int &y){ x^=y^=x^=y; }
inline int lca(int u,int v)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
}
}
using LCA::lca;
int s[1000002],top;
#define clear(u) T.h[u]=0
inline void insert(int u)//插入虚树
{
int l=lca(u,s[top]);
if(l!=s[top])
{
while(id[l]<id[s[top-1]]) T.add_edge(s[top-1],s[top]),top--;
if(id[l]!=id[s[top-1]]) clear(l),T.add_edge(l,s[top]),s[top]=l;
else T.add_edge(l,s[top]),top--;
}
clear(u),s[++top]=u;
}
inline bool cmp(int u,int v){ return id[u]<id[v]; }
inline void build(int n,int *a)
{
sort(a+1,a+n+1,cmp);
T.ecnt=0,clear(1),s[top=1]=1;
for(int i=1;i<=n;i++)
if(a[i]!=1) insert(a[i]);
for(int i=1;i<top;i++) T.add_edge(s[i],s[i+1]);
}
long long dp[1000002];
bool b[1000002];
void dfs(int u,int fa)
{
dp[u]=0;
for(int i=T.h[u];i;i=T.e[i].next)
if(T.e[i].v!=fa)
{
dfs(T.e[i].v,u);
if(b[T.e[i].v]) dp[u]+=dis[T.e[i].v];
else dp[u]+=min(dis[T.e[i].v],dp[T.e[i].v]);
}
}
int n,m,k,a[1000002];
int main()
{
scanf("%d",&n);
for(int i=1,u,v,w;i<n;i++)
scanf("%d%d%d",&u,&v,&w),G.add_edge(u,v,w);
dis[0]=inf;
LCA::dfs1(1,0,inf);
LCA::dfs2(1,1);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&k);
for(int j=1;j<=k;j++)
scanf("%d",&a[j]),b[a[j]]=1;
build(k,a);
dfs(1,0);
printf("%lld\n",dp[1]);
for(int j=1;j<=k;j++) b[a[j]]=0;
}
return 0;
}