[暴力/LCA]JZOJ 1209 拉力赛
分析
显然求路径长我们搞个树上前缀和即可
然后求能否到达,可用LCA(懒得打)用了时间戳法
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int N=1e4+10; ll a[N]; int st[N],ed[N]; int tm; struct Edge { int u,v,nx; ll w; }e[N]; int cnt,list[N]; int n,m; void Add(int u,int v,ll w) { e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].nx=list[u];list[u]=cnt; } void Dfs(int u) { tm++; st[u]=tm; for (int i=list[u];i;i=e[i].nx) { a[e[i].v]=a[u]+e[i].w; Dfs(e[i].v); } tm++; ed[u]=tm; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n-1;i++) { int u,v; ll w; scanf("%d%d%lld",&u,&v,&w); Add(u,v,w); } Dfs(1); ll count=0,ans=0; for (int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); if (st[u]<=st[v]&&ed[v]<=ed[u]) count++,ans+=a[v]-a[u]; } printf("%lld\n%lld\n",count,ans); }
在日渐沉没的世界里,我发现了你。