HDOJ5044(最近公共祖先)
- #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(最近公共祖先)的更多相关文章
- LCA最近公共祖先 ST+RMQ在线算法
对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决. 这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...
- 【转】最近公共祖先(LCA)
基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的 ...
- 【并查集】【树】最近公共祖先LCA-Tarjan算法
最近公共祖先LCA 双链BT 如果每个结点都有一个指针指向它的父结点,于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表.因此这个问题转换为两个单向链表的第一个公共结点(先分别遍历两个链表 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...
- Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】
一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...
- 数据结构作业——sights(最短路/最近公共祖先)
sights Description 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点,由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱的小风姑娘不想走那么 ...
- [最近公共祖先] POJ 3728 The merchant
The merchant Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4556 Accepted: 1576 Desc ...
- [最近公共祖先] POJ 1330 Nearest Common Ancestors
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 27316 Accept ...
- 图论--最近公共祖先问题(LCA)模板
最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...
随机推荐
- less (css预处理)
用法 1. 必须在head内 2. 样式文件必须先加载 <head> <meta charset='utf-8'> <link rel="stylesheet/ ...
- 从内存中加载并启动一个exe
windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动.而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法.用途嘛, 也许可以用来保护你的exe,你可以对要保 ...
- [luogu4755]Beautiful Pair
[luogu4755]Beautiful Pair luogu 第一次写最大值分治感觉有点丑 每次找到最大值mid,扫小的一边,主席树查大的一边小于等于\(\frac{a[mid]}{a[i]}\)的 ...
- eclipse js调试
问题: js经常会被浏览器给cache,不管怎么刷都是原来的. 解决: 暂时有一个方法,一刷新就好,下面的截图: 1)先打开 <开发者工具> 2)找到Sources 3)Page中找到你的 ...
- (转)关于Http协议,一片就够了
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
- ubuntu 安装 phpstorm
phpstorm是用JAVA开发的,所以在安装之前需要先安装jdksudo apt-get install default-jdk从官网上下载phpstorm 的linux版本 http://www. ...
- Html标签使用——文字、列表、表格、超链接
注:文章来源于传智播客毕向东老师使用课件和网络.整理学习如下: 一.Html内容 1. Html就是超文本标记语言的简写,是最基础的网页语言. 2. Html是通过标签来定义的语言,代码都是由 ...
- [原创]Scala学习:编写Scala脚本
scala支持脚本 1)在/opt/scala-script下创建一个文件hello.scala 编辑内容如下: $ hello ,this is the first scala script 2)运 ...
- android OTG【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7707056 一.OTG的概念 OTG是On-The-Go的缩写,是近年发展起来的技术, ...
- 字典树 HDU 1075 What Are You Talking About
http://acm.hdu.edu.cn/showproblem.php?pid=1075 ;}