标签:des style blog http io color os ar java
5 1 2 1 2 3 1 3 4 1 4 5 1 1 0 0 0 1 5 1 2 1 2 3 1 3 4 1 4 5 1 1 0 0 0 0 1 1 1 0
2 4 0 1
/* *********************************************** Author :rabbit Created Time :2014/11/1 22:13:28 File Name :6.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=100100; struct Edge{ int next,to,w; }edge[maxn*2]; int head[maxn],tot; void init(){ tot=0; memset(head,-1,sizeof(head)); } inline void addedge(int u,int v,int w){ edge[tot].to=v; edge[tot].next=head[u]; edge[tot].w=w; head[u]=tot++; } int size[maxn],vis[maxn],fa[maxn],que[maxn]; int TT; inline int getroot(int u){ int Min=maxn,root=0; int l,r; que[l=r=1]=u; fa[u]=0; for(;l<=r;l++) for(int i=head[que[l]];i!=-1;i=edge[i].next){ int v=edge[i].to; if(v==fa[que[l]]||vis[v]==TT)continue; que[++r]=v; fa[v]=que[l]; } for(l--;l;l--){ int x=que[l],Max=0; size[x]=1; for(int i=head[x];i!=-1;i=edge[i].next){ int v=edge[i].to; if(v==fa[x]||vis[v]==TT)continue; Max=max(Max,size[v]); size[x]+=size[v]; } Max=max(Max,r-size[x]); if(Max<Min){ Min=Max;root=x; } } return root; } int ans[maxn]; pair<int,int> pp[maxn],np[maxn]; int dis[maxn],type[maxn]; inline void go(int u,int pre,int w,int tt){ int l,r; que[l=r=1]=u; fa[u]=pre;dis[u]=w; for(;l<=r;l++) for(int i=head[que[l]];i!=-1;i=edge[i].next){ int v=edge[i].to; if(v==fa[que[l]]||vis[v]==TT)continue; que[++r]=v; fa[v]=que[l]; dis[v]=dis[que[l]]+edge[i].w; } int cnt=0; for(int i=1;i<=r;i++){ int x=que[i]; pp[cnt++]=make_pair(np[x].first-dis[x],np[x].second); } sort(pp,pp+cnt); for(int i=1;i<=r;i++){ int x=que[i]; if(type[x])continue; int id=lower_bound(pp,pp+cnt,make_pair(dis[x],x))-pp; ans[x]+=(cnt-id)*tt; } } void solve(int u){ int root=getroot(u); vis[root]=TT; go(root,0,0,1); for(int i=head[root];i!=-1;i=edge[i].next){ int v=edge[i].to; if(vis[v]==TT)continue; go(v,root,edge[i].w,-1); } for(int i=head[root];i!=-1;i=edge[i].next){ int v=edge[i].to; if(vis[v]==TT)continue; solve(v); } } bool ff[maxn]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n; memset(vis,0,sizeof(vis)); TT=0; while(~scanf("%d",&n)){ init(); int u,v,w; for(int i=1;i<n;i++){ scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); } for(int i=1;i<=n;i++)scanf("%d",&type[i]); queue<int> q; for(int i=1;i<=n;i++) if(type[i]){ np[i]=make_pair(0,i); ff[i]=true; q.push(i); } else { np[i]=make_pair(INF,0); ff[i]=false; } while(!q.empty()){ int u=q.front(); q.pop(); ff[u]=0; for(int i=head[u];i!=-1;i=edge[i].next){ v=edge[i].to; pair<int,int> tmp=make_pair(np[u].first+edge[i].w,np[u].second); if(tmp<np[v]){ np[v]=tmp; if(!ff[v]){ ff[v]=1; q.push(v); } } } } TT++; for(int i=1;i<=n;i++)ans[i]=0; solve(1); int ret=0; for(int i=1;i<=n;i++)ret=max(ret,ans[i]); cout<<ret<<endl; } return 0; }
标签:des style blog http io color os ar java
原文地址:http://blog.csdn.net/xianxingwuguan1/article/details/40690999