博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2586 LCA
阅读量:4689 次
发布时间:2019-06-09

本文共 1343 字,大约阅读时间需要 4 分钟。

最近公共祖先

dis[a,b]  =  dis[1,a]+dis[1,b]-2*dis[1,lca[a,b]];

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define inf 1000000000#define MAXN 40010struct edge{ int fr,to,w,next;}edg[MAXN*2],edg1[MAXN];int cnt,tot;int head[MAXN],head1[MAXN];bool vis[MAXN];void add(int u,int v,int w){ edg[cnt].fr=u; edg[cnt].to=v; edg[cnt].w=w; edg[cnt].next=head[u]; head[u]=cnt++;}void add1(int u,int v,int w){ edg1[tot].next=head1[u]; edg1[tot].to=v; edg1[tot].fr=u; edg1[tot].w=w; head1[u]=tot++;}int dis[MAXN],lca[MAXN],fa[MAXN];int find1(int a){ if(a==fa[a]) return a; else { int b=find1(fa[a]); return fa[a]=b; }}void tarjan(int u){ // printf("1"); vis[u]=1; fa[u]=u; for(int i=head1[u];i!=-1;i=edg1[i].next) { int v=edg1[i].to; if(vis[v]) lca[edg1[i].w]=find1(v); } for(int i=head[u];i!=-1;i=edg[i].next) { int v=edg[i].to; if(!vis[v]) { dis[v]=dis[u]+edg[i].w; tarjan(v); fa[v]=u; } }}int main(){ int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); cnt=0; for(int i=1;i
<= m;i++) //离线算法 记录下这2个点查询的排名 { int a,b; scanf("%d%d",&a,&b); add1(a,b,i); add1(b,a,i); } dis[1]=0; tarjan(1); for(int i=0;i

 

转载于:https://www.cnblogs.com/cherryMJY/p/6472081.html

你可能感兴趣的文章
winform窗口关闭提示
查看>>
64款工具,总有合适您的那款
查看>>
我的第一篇博客
查看>>
大数据学习线路整理
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
关于ProjectServer定制化项目中心页面
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>
润乾报表 动态控制文本的显示
查看>>
[oracle] 如何使用myBatis在数据库中插入数据并返回主键
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>