Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <vector>
- using namespace std;
- vector<int> adj[200200];
- vector<long long> edg[200200];
- long long dp[200200];
- long long r[200200];
- long long l[200200];
- bool vis[200200];
- int n;
- int a,b,c;
- int t;
- void is_tree(int nd,int p){
- if(vis[nd])while(1);
- vis[nd]=true;
- for(int i=0;i<adj[nd].size();i++){
- if(adj[nd][i]==p)continue;
- is_tree(adj[nd][i],nd);
- }
- }
- void d(int nd,int p){
- for(int i=0;i<adj[nd].size();i++){
- int ch=adj[nd][i];
- if(ch==p){
- adj[nd].erase(adj[nd].begin()+i);
- edg[nd].erase(edg[nd].begin()+i);
- }
- }
- for(int i=0;i<adj[nd].size();i++){
- int ch=adj[nd][i];
- d(ch,nd);
- }
- }
- void dfs1(int nd){
- dp[nd]=0;
- for(int i=0;i<adj[nd].size();i++){
- int ch=adj[nd][i];
- dfs1(ch);
- dp[nd]=max(dp[nd],dp[ch]+edg[nd][i]);
- }
- }
- void dfs2(int nd,long long up){
- dp[nd]=max(dp[nd],up);
- int k=adj[nd].size();
- for(int i=0;i<k;i++){
- int ch=adj[nd][i];
- if(i==0){
- l[ch]=dp[ch]+edg[nd][i];
- } else {
- int pr=adj[nd][i-1];
- l[ch]=max(l[pr],dp[ch]+edg[nd][i]);
- }
- }
- for(int i=k-1;i>=0;i--){
- int ch=adj[nd][i];
- if(i==k-1){
- r[ch]=dp[ch]+edg[nd][i];
- } else {
- int nxt=adj[nd][i+1];
- r[ch]=max(r[nxt],dp[ch]+edg[nd][i]);
- }
- }
- for(int i=0;i<k;i++){
- int ch=adj[nd][i];
- long long best=up;
- if(i!=0){
- best=max(best,l[adj[nd][i-1]]);
- }
- if(i!=k-1){
- best=max(best,r[adj[nd][i+1]]);
- }
- dfs2(ch,best+edg[nd][i]);
- }
- }
- int main(){
- //cin>>t;
- scanf("%d",&t);
- if(t>10)while(1);
- while(t--){
- //cin>>n;
- scanf("%d",&n);
- if(n<2 || n>100000)while(1);
- for(int i=1;i<=n;i++){
- dp[i]=0;
- l[i]=0;
- r[i]=0;
- adj[i].clear();
- edg[i].clear();
- vis[i]=false;
- }
- for(int i=2;i<=n;i++){
- //cin>>a>>b>>c;
- scanf("%d %d %d",&a,&b,&c);
- if(a<1 || a>n)while(1);
- if(b<1 || b>n)while(1);
- adj[a].push_back(b);
- adj[b].push_back(a);
- edg[a].push_back(c);
- edg[b].push_back(c);
- }
- is_tree(1,1);
- for(int i=1;i<=n;i++){
- if(!vis[i])while(1);
- }
- d(1,1);
- dfs1(1);
- dfs2(1,0);
- for(int i=1;i<n;i++){
- //cout<<dp[i]<<" ";
- printf("%lld ",dp[i]);
- }
- //cout<<dp[n]<<endl;
- printf("%lld\n",dp[n]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement