HDU 5044 Tree

#include <stdio.h>                                                                     
#include <string.h>                                                                    
#define maxn 100005                                                                    
struct node                                                                            
{                                                                                      
int v, id, next;                                                                      
}edge[maxn*4];                                                                         
bool vis[maxn], op[maxn];                                                              
int a[maxn], b[maxn], k[maxn], lca[maxn], to[maxn];                                    
int head[maxn], opr[maxn], fa[maxn], father[maxn];                                     
long long int valnode[maxn], valedge[maxn];                                            
int n, m, cnt;                                                                         
void add(int u, int v, int id, int h[])                                                
{                                                                                      
edge[cnt].v = v;                                                                      
edge[cnt].id = id;                                                                    
edge[cnt].next = h[u];                                                                
h[u] = cnt++;                                                                         
}                                                                                      
int find(int x)                                                                        
{                                                                                      
if(x == father[x]) return x;                                                          
return find(father[x]);                                                               
}                                                                                      
void tarjan(int now, int f)                                                            
{                                                                                      
father[now] = now;                                                                    
fa[now] = f;                                                                          
vis[now] = true;                                                                      
for(int i = opr[now];i != -1;i = edge[i].next)                                        
{                                                                                     
int v = edge[i].v, id = edge[i].id;                                                  
if(vis[v]) lca[id] = find(v);                                                        
}                                                                                     
for(int i = head[now];i != -1;i = edge[i].next)                                       
{                                                                                     
int v = edge[i].v, id = edge[i].id;                                                  
if(v == f) continue;                                                                 
tarjan(v, now);                                                                      
to[id] = v;                                                                          
father[v] = now;                                                                     
}                                                                                     
}                                                                                      
void init()                                                                            
{                                                                                      
cnt = 0;                                                                              
memset(head, -1, sizeof(head));                                                       
memset(opr, -1, sizeof(opr));                                                         
memset(vis, 0, sizeof(vis));                                                          
memset(valedge, 0, sizeof(valedge));                                                  
memset(valnode, 0, sizeof(valnode));                                                  
}                                                                                      
                                                                                       
void getans(int now, int f)                                                            
{                                                                                      
for(int i = head[now];i != -1;i = edge[i].next)                                       
{                                                                                     
int v = edge[i].v, id = edge[i].id;                                                  
if(v == f) continue;                                                                 
getans(v, now);                                                                      
valnode[now] += valnode[v];                                                          
valedge[now] += valedge[v];                                                          
}                                                                                     
}                                                                                      
int main()                                                                             
{                                                                                      
int t, i, u, v, Case;                                                                 
char ask[5];                                                                          
scanf("%d", &t);                                                                      
Case = 1;                                                                             
while(t--)                                                                            
{                                                                                     
init();                                                                              
scanf("%d %d", &n, &m);                                                              
for(i = 0;i < n - 1;i++)                                                             
{                                                                                    
scanf("%d %d", &u, &v);                                                             
add(u, v, i, head);                                                                 
add(v, u, i, head);                                                                 
}                                                                                    
for(i = 0;i < m;i++)                                                                 
{                                                                                    
scanf("%s %d %d %d", ask, &a[i], &b[i], &k[i]);                                     
op[i] = ask[3] == '1';                                                              
add(a[i], b[i], i, opr);                                                            
add(b[i], a[i], i, opr);                                                            
}                                                                                    
tarjan(1, -1);                                                                       
fa[1] = 0;                                                                           
for(i = 0;i < m;i++)                                                                 
{                                                                                    
if(op[i])                                                                           
{                                                                                   
valnode[a[i]] += k[i];                                                             
valnode[b[i]] += k[i];                                                             
valnode[lca[i]] -= k[i];                                                           
valnode[fa[lca[i]]] -= k[i];                                                       
  }                                                                                  
  else                                                                               
  {                                                                                  
valedge[a[i]] += k[i];                                                            
valedge[b[i]] += k[i];                                                             
valedge[lca[i]] -= 2*k[i];                                                       
}                                                                                  
}                                                                                    
getans(1, -1);                                                                       
printf("Case #%d:\n", Case++);                                                       
for(i = 1;i <= n;i++)                                                                
printf("%lld%c", valnode[i], i==n?'\n':' ');                                        
for(i = 0;i < n - 1;i++)                                                             
printf("%lld%c", valedge[to[i]], i==n-2?'\n':' ');                                  
if(n == 1) printf("\n");                                                             
}                                                                                     
return 0;                                                                             
}                                                                                      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值