#include<cstdio>
#include<cstring>
using namespace std;
const int MAX_N=;
struct Edge{
int v,id,next;
}edge[MAX_N*];
int a[MAX_N],b[MAX_N],to[MAX_N],k[MAX_N],lca[MAX_N];
int head[MAX_N],opr[MAX_N],fa[MAX_N],father[MAX_N];
int cnt;
long long valnode[MAX_N],valedge[MAX_N];
bool type[MAX_N],vis[MAX_N];
void init()
{
memset(valnode,,sizeof(valnode));
memset(valedge,,sizeof(valedge));
memset(opr,-,sizeof(opr));
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
cnt=;
}
int findfa(int a)
{
return father[a]==a?a:findfa(father[a]);
}
void addedge(int u,int v, int id)
{
edge[cnt].v=v;
edge[cnt].next=head[u];
edge[cnt].id=id;
head[u]=cnt++;
}
void addopr(int u,int v, int id)
{
edge[cnt].v=v;
edge[cnt].next=opr[u];
edge[cnt].id=id;
opr[u]=cnt++;
}
void LCA(int now, int f)
{
father[now]=now;
fa[now]=f;
vis[now]=true;
for(int i=opr[now];i!=-;i=edge[i].next)
{
int v=edge[i].v;
int id=edge[i].id;
if(vis[v])
lca[id]=findfa(v);
}
for(int i=head[now];i!=-;i=edge[i].next)
{
int v=edge[i].v;
int id=edge[i].id;
if(v==f)
continue;
LCA(v,now);
to[id]=v;
father[v]=now;
}
}
void getans(int now, int fa)
{
for(int i=head[now];i!=-;i=edge[i].next)
{
int v=edge[i].v;
int id=edge[i].id;
if(v==fa)
continue;
getans(v,now);
valnode[now]+=valnode[v];
valedge[now]+=valedge[v];
}
}
int main()
{
int n,m,t;
scanf("%d",&t);
int l=;
while(l<t)
{
init();
scanf("%d %d",&n,&m);
for(int i=;i<n-;i++)
{
int u,v;
scanf("%d %d",&u,&v);
addedge(u,v,i);
addedge(v,u,i);
}
for(int i=;i<m;i++)
{
char str[];
scanf("%s",str);
scanf("%d %d %d",&a[i],&b[i],&k[i]);
type[i]=str[]=='';
addopr(a[i],b[i],i);
addopr(b[i],a[i],i);
}
LCA(,-);
fa[]=;
for(int i=;i<m;i++)
{
if(type[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]]-=k[i]*;
}
}
getans(,-);
printf("Case #%d:\n",++l);
for(int i=;i<=n;i++)
{
if(i!=)
putchar(' ');
printf("%I64d",valnode[i]);
}
putchar('\n');
for(int i=;i<n-;i++)
{
if(i)
putchar(' ');
printf("%I64d",valedge[to[i]]);
}
puts("");
}
return ;
}

HDOJ5044(最近公共祖先)的更多相关文章

  1. LCA最近公共祖先 ST+RMQ在线算法

    对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决.     这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...

  2. 【转】最近公共祖先(LCA)

    基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的 ...

  3. 【并查集】【树】最近公共祖先LCA-Tarjan算法

    最近公共祖先LCA 双链BT 如果每个结点都有一个指针指向它的父结点,于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表.因此这个问题转换为两个单向链表的第一个公共结点(先分别遍历两个链表 ...

  4. 洛谷P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...

  5. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

  6. 数据结构作业——sights(最短路/最近公共祖先)

    sights Description 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点,由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱的小风姑娘不想走那么 ...

  7. [最近公共祖先] POJ 3728 The merchant

    The merchant Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4556   Accepted: 1576 Desc ...

  8. [最近公共祖先] POJ 1330 Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27316   Accept ...

  9. 图论--最近公共祖先问题(LCA)模板

    最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...

随机推荐

  1. iOS Base64加密

    1.Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0 ...

  2. unix网络编程笔记(二)

    第四章笔记 1. 基本Tcpclient/server程序的套接字函数 2. socket函数: int socket(int family,int type,int protocol); (1)so ...

  3. linux c编程:进程控制(二)_竞争条件

    前面介绍了父子进程,如果当多个进程企图对共享数据进行处理.而最后的结果又取决于进程运行的顺序时,就认为发生了竞争关系.通过下面的例子来看下 在这里标准输出被设置为不带缓冲的,于是父子进程每输出一个字符 ...

  4. c语言操作mysql数据库

    c语言操作Mysql数据库,主要就是为了实现对数据库的增.删.改.查等操作,操作之前,得先连接数据库啊,而连接数据库主要有两种方法.一.使用mysql本身提供的API,在mysql的安装目录中可可以看 ...

  5. mysql 修改表名的方法:sql语句

    在使用mysql时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢? 可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦. 能否简单使用 ...

  6. pinpoint agent线程模型

    pinpoint agent线程模型 以下分析基于pinpoint1.7.1版本 pinpoint agent主要使用到的异步线程有4个 DeadlockMonitorThread : 死锁监测线程, ...

  7. 导入android sdk samples工程报错"did you mean to use @+id instead of @+android:id?"

    导入“D:\adt-bundle-windows-x86_64-20140702\sdk\samples\android-15”中的工程报错 did you mean to use @+id inst ...

  8. 第十二、模块二、调用中国天气网和qqOnline及TrainTimeWebService接口来突出Json方法

    一. 浏览网页的时候,发送的请求.服务器反回来的永远是字符串,由于服务器后台使用的语言不通,所以就需要用工具反解,这里用到了json json方法一 json.loads()将字符串转化为python ...

  9. 2014年的暑假ACM之旅!

    致未来的我: 回到学校了,又开始了繁忙的生活! 虽然每天都不太轻松,但还是蛮有乐趣的,一起讨论某道题或者某种算法时挺开心的.@我.@姜维波.@曹彦宝.@李岩.@张永宏 继续这样下去,直到这个暑假的结束 ...

  10. POJ 3070 矩阵mob

    . 矩阵高速幂想法与快速幂相同 #include<iostream> #include<cstdio> #include<cstring> #define MOD ...