时态同步
2019-05-15 21:01 一只弱鸡丶 阅读(164) 评论(0) 编辑 收藏 举报#include <cstdio> #include <cstring> #include <cmath> #include <string> using namespace std; #define ll long long #define re register const int N=1e6; void read(int &a) { a=0; int d=1; char ch; while(ch=getchar(),ch>'9'||ch<'0') if(ch=='-') d=-1; a=ch^48; while(ch=getchar(),ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+(ch^48); a*=d; } struct note { int dis,to,next; }edge[N]; int head[N],num,maxn[N]; inline void add(int u,int v,int w) { edge[++num].next=head[u]; edge[num].to=v; edge[num].dis=w; head[u]=num; } ll ans; inline void dfs(int x,int fa) { for(re int i=head[x];i;i=edge[i].next) if(edge[i].to!=fa) dfs(edge[i].to,x); for(re int i=head[x];i;i=edge[i].next) if(edge[i].to!=fa) maxn[x]=max(maxn[x],edge[i].dis);///算出以x为根往其他支路跑的最大时间 for(re int i=head[x];i;i=edge[i].next) if(edge[i].to!=fa) ans+=maxn[x]-edge[i].dis;///统计答案 for(re int i=head[fa];i;i=edge[i].next) if(edge[i].to==x) { edge[i].dis+=maxn[x];///父节点加上走完剩下支路的最大时间 break; } } int main() { int n,s; read(n); read(s); for(re int i=1;i<n;i++) { int u,v,w; read(u); read(v); read(w); add(u,v,w); add(v,u,w); } dfs(s,0); printf("%lld\n",ans); return 0; }