给出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算法的更多相关文章

  1. LCA 离线的Tarjan算法 poj1330 hdu2586

    LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...

  2. (转载)LCA问题的Tarjan算法

    转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两 ...

  3. 有向图的强连通算法 -- tarjan算法

    (绘图什么真辛苦) 强连通分量: 在有向图 G 中.若两个顶点相互可达,则称两个顶点强连通(strongly connected). 假设有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有 ...

  4. hdu 2874(LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 思路:近乎纯裸的LCA,只是题目给出的是森林,就要判断是否都在同一颗树上,这里我们只需判断两个子 ...

  5. 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]=; } ...

  6. LCA离线算法Tarjan的模板

    hdu 2586:题意:输入n个点的n-1条边的树,m组询问任意点 a b之间的最短距离 思路:LCA中的Tarjan算法,RMQ还不会.. #include <stdio.h> #inc ...

  7. Tarjan算法离线 求 LCA(最近公共祖先)

    本文是网络资料整理或部分转载或部分原创,参考文章如下: https://www.cnblogs.com/JVxie/p/4854719.html http://blog.csdn.net/ywcpig ...

  8. 【POJ 1330 Nearest Common Ancestors】LCA问题 Tarjan算法

    题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...

  9. POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)

    题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...

随机推荐

  1. ORA-03137 - ORA-12592 TNS:BAD PACKET OR ORA-3137 故障处理

    环境 操作系统:CentOS release 6.8 数据库:oracle 11.2.0.4.190115 说明:数据库psu 为19年1月份的补丁,可不间断运行,但是开发提示在执行一些批处理的时候, ...

  2. Scrapy中的UA池,代理池,以及selenium的应用

    UA池 代理池 selenium在Scrapy中的应用 UA池 - 下载中间件: - 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件. - 作用 ...

  3. C#解除某类警告。。。。。。。。。。

    C#预处理器指令取消不必要的警告 今天将自己写的一个类库生成一个DLL后,想把注释也加进去.... 方法:在属性->生成选项卡->XML文档文件(勾选)(生成的文件名不能修改,使用时必须跟 ...

  4. 单件模式(Singleton)C++实现

    意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 实用性:1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它. 2.当这个唯一的实例应该是通过子类可扩展的,并且客户应该无需更改 ...

  5. Linux下打包、压缩和解压

    命令使用:tar  主选项+辅选项  压缩后文件名  要压缩的文件 -c 建立压缩文件(常用) -x 解压(常用) -t 查看压缩文件(常用) -r 向压缩文件末尾追加文件 -u 更新一个压缩包中的文 ...

  6. spring之pom.xml配置

    spring之pom.xml配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  7. Self-hosting Sentry With Docker and Docker-compose

    If a user encounters an error but you don't know about, did it happen at all? Sentry is one of the s ...

  8. wp版笔记本应用源码

    今天在那个WP教程网看到了一个不错的项目,简单的记事本,主要是用到的独立存储文件的操作,TimePicker和DatePicker的是用,数据绑定,界面的参考的chanraycode的,主要是锻炼自己 ...

  9. 优动漫PAINT是什么?有哪些功能和特色

    优动漫PAINT软件介绍: 优动漫PAINT是一款功能强大的漫画制作软件,该软件可以帮助漫画创作人员制作出完美,惟妙惟肖的漫画作品,它搭载了绘制漫画和插画所需的所有功能--丰富的笔工具.超强的笔压感应 ...

  10. 洛谷 P1328 生活大爆炸版石头剪刀布 模拟

    很简单 Code: #include<cstdio> #include<queue> using namespace std; queue<int>A; queue ...