BZOJ 1060 时态同步

时间:2022-07-22 18:07:44

贪心。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 500500
#define maxe 1000500
using namespace std;
int n,s,x,y,z,f[maxv],g[maxv],nume=;
long long ans=;
struct edge
{
int v,w,nxt;
}e[maxe];
void addedge(int u,int v,int w)
{
e[++nume].v=v;
e[nume].w=w;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs(int x,int fath)
{
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v==fath) continue;
dfs(v,x);f[x]=max(f[x],f[v]+e[i].w);
}
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v==fath) continue;
ans+=f[x]-f[v]-e[i].w;
}
}
int main()
{
scanf("%d%d",&n,&s);
for (int i=;i<=n-;i++)
{
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);addedge(y,x,z);
}
dfs(s,);
printf("%lld\n",ans);
return ;
}