记录编号 |
87736 |
评测结果 |
AAAAWWWWWW |
题目名称 |
[ZJOI 2007]时态同步 |
最终得分 |
40 |
用户昵称 |
QWERTIer |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
1.392 s |
提交时间 |
2014-02-09 10:32:32 |
内存使用 |
23.20 MiB |
显示代码纯文本
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<stack>
#define For(i,n) for(int i=1; i<=n; i++)
#define Rep(i,n) for(int i=0; i<n; i++)
#define N 500010
typedef long long LL;
using namespace std;
LL ans;
int n,root;
int ev[N<<1],ed[N<<1],le[N],pe[N<<1],ecnt;
void addEdge(int u,int v,int d){
ecnt++;
pe[ecnt]=le[u];
le[u]=ecnt;
ed[ecnt]=d;
ev[ecnt]=v;
}
int fa[N];
LL dist[N],maxd[N];
void dfs(){
stack<int> st;
st.push(root);
while(!st.empty()){
int u=st.top(),flag=0;
for(int i=le[u]; i; i=pe[i]){
int v=ev[i],d=ed[i];
if(v==fa[u]||fa[v])continue;
st.push(v);
fa[v]=u;
dist[v]=dist[u]+d;
flag=1;
}
if(!flag){
maxd[u]=dist[u];
for(int i=le[u]; i; i=pe[i]){
int v=ev[i],d=ed[i];
if(v==fa[u])continue;
maxd[u]=max(maxd[u],maxd[v]);
}
for(int i=le[u]; i; i=pe[i]){
int v=ev[i],d=ed[i];
if(v==fa[u])continue;
ans+=maxd[u]-maxd[v];
}
st.pop();
}
}
}
int main(){
freopen("synch.in","r",stdin);
freopen("synch.out","w",stdout);
scanf("%d",&n);
scanf("%d",&root);
For(i,n-1){
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
addEdge(u,v,d);
addEdge(v,u,d);
}
dfs();
printf("%I64d\n",ans);
return 0;
}