HDU 2874 LCA离线算法 tarjan算法
给出N个点,M条边。Q次询问
Q次询问每两点之间的最短距离
典型LCA 问题 Marjan算法解
#include "stdio.h"
#include "string.h" struct Edge
{
int to,next,len;
}edge[20010]; struct Ques
{
int to,next,index;
}ques[2000010];
int head[10010],q_head[10010],f[10010],dis[10010]; int vis[10010],ans[1000010];
// vis记录结点是否被遍历过,而且存储结点所在的树是哪颗
// ans记录每一个询问的答案
int n,m,q,tot,q_tot; void add_edge(int a,int b,int c)
{
edge[tot].to=b;
edge[tot].next=head[a];
edge[tot].len=c;
head[a]=tot++; edge[tot].to=a;
edge[tot].next=head[b];
edge[tot].len=c;
head[b]=tot++;
} void add_ques(int a,int b,int index)
{
ques[q_tot].to=b;
ques[q_tot].next=q_head[a];
ques[q_tot].index=index;
q_head[a]=q_tot++; ques[q_tot].to=a;
ques[q_tot].next=q_head[b];
ques[q_tot].index=index;
q_head[b]=q_tot++;
} int find(int w)
{
if (f[w]==w) return w;
return f[w]=find(f[w]);
} void Tarjan(int w,int deep,int root) // w:当前点,deep:当前深度,root:根节点
{
int i,v;
f[w]=w;
vis[w]=root;
dis[w]=deep; for (i=q_head[w];i!=-1;i=ques[i].next)
{
v=ques[i].to;
if (vis[v]==root)
ans[ques[i].index]=dis[v]+dis[w]-2*dis[find(v)];
} for (i=head[w];i!=-1;i=edge[i].next)
{
v=edge[i].to;
if (vis[v]==-1)
{
Tarjan(v,deep+edge[i].len,root);
f[v]=w;
}
}
}
void init()
{
int i,a,b,c;
memset(head,-1,sizeof(head));
memset(q_head,-1,sizeof(q_head));
tot=q_tot=0; while (m--)
{
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
} for (i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
add_ques(a,b,i);
}
memset(vis,-1,sizeof(vis));
memset(ans,-1,sizeof(ans));
}
int main()
{
int i;
while (scanf("%d%d%d",&n,&m,&q)!=EOF)
{
init();
for (i=1;i<=n;i++)
if (vis[i]==-1)
Tarjan(i,0,i); for (i=1;i<=q;i++)
if (ans[i]==-1)
printf("Not connected\n");
else
printf("%d\n",ans[i]);
}
return 0;
}
HDU 2874 LCA离线算法 tarjan算法的更多相关文章
- LCA 离线的Tarjan算法 poj1330 hdu2586
LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...
- (转载)LCA问题的Tarjan算法
转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两 ...
- 有向图的强连通算法 -- tarjan算法
(绘图什么真辛苦) 强连通分量: 在有向图 G 中.若两个顶点相互可达,则称两个顶点强连通(strongly connected). 假设有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有 ...
- hdu 2874(LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 思路:近乎纯裸的LCA,只是题目给出的是森林,就要判断是否都在同一颗树上,这里我们只需判断两个子 ...
- LCA 离线做法tarjan
tarjan(int u) { int v; for(int i=h[u];i;i=nex[i])//搜索边的 { v=to[i]; tarjan(v); marge(u,v); vis[v]=; } ...
- LCA离线算法Tarjan的模板
hdu 2586:题意:输入n个点的n-1条边的树,m组询问任意点 a b之间的最短距离 思路:LCA中的Tarjan算法,RMQ还不会.. #include <stdio.h> #inc ...
- Tarjan算法离线 求 LCA(最近公共祖先)
本文是网络资料整理或部分转载或部分原创,参考文章如下: https://www.cnblogs.com/JVxie/p/4854719.html http://blog.csdn.net/ywcpig ...
- 【POJ 1330 Nearest Common Ancestors】LCA问题 Tarjan算法
题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...
- POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...
随机推荐
- 浅析CLR的事件
文章目录: 1.C#(.net framework框架)中的事件以及特点 2.事件的组成部分 3.编辑器如何实现事件的 4.显式实现事件 1.C#(.net framework ...
- 基于jQuery封装一个瀑布流插件
/*封装一个瀑布流插件*/ (function($){ $.fn.WaterFall = function(){ /*这是你初始化 调用这个方法的时候的 那个jquery选着到的dom对象 this* ...
- Android 使用WindowManager实现Android悬浮窗
WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象. 每一个WindowMan ...
- Django学习笔记----settings and database_based App demo
原文参考docs.djangoproject.com, what can manage.py utility do? find here. 1.Database Setup 编辑settings.py ...
- 【Oracle】创建用户
任务: 1)创建用户siebel,密码oracle 2)授予sse_role,tblo_role角色 3)siebel用户没有对system,sysaux的使用权限 4)默认表空间ts_users,无 ...
- Hoj_平方和与立方和
平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- (转)RabbitMQ学习之spring整合发送异步消息(注解实现)
http://blog.csdn.net/zhu_tianwei/article/details/40919249 实现使用Exchange类型为DirectExchange. routingkey的 ...
- gitlab安装和汉化
Centos 7.x 安装 gitlab-ce-8.8.0-ce 一.安装配置依赖项 yum -y install curl unzip policycoreutils git wget # 依赖包 ...
- Javaee 内部引用
1.final修饰类,修饰方法,修饰变量有什么特点? final修饰的类不能被继承太监类,可以被继承使用但不能修改,如果父类没有final修饰的方法子类可以添加上,成员变量需要在建类前被赋值且不能改动 ...
- hibernate简单集合映射和获取
简单集合映射(可以直接获取) // javabean设计 public class User { private int userId; private String userName; // 一个用 ...