HDU 2874 Connections between cities(LCA离线算法实现)
http://acm.hdu.edu.cn/showproblem.php?pid=2874
题意:
求两个城市之间的距离。
思路:
LCA题,注意原图可能不连通。
如果不了解离线算法的话,可以看我之前博客写的解释http://www.cnblogs.com/zyb993963526/p/7295894.html
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+;
const int M=; int n, m, c;
int etot,qtot;
int ehead[maxn];
int qhead[maxn];
int mark[maxn];
int dis[maxn];
int vis[maxn]; int ans[M];
int p[maxn]; struct node
{
int v,w;
int next;
}e[*maxn]; struct Node
{
int v;
int index;
int next;
}query[*M]; void addEdge(int u, int v, int w)
{
e[etot].v=v;
e[etot].w=w;
e[etot].next=ehead[u];
ehead[u]=etot++;
} void addQuery(int u, int v, int i)
{
query[qtot].v=v;
query[qtot].index=i;
query[qtot].next=qhead[u];
qhead[u]=qtot++;
} int Find(int x)
{
return p[x]==x?x:p[x]=Find(p[x]);
} void LCA(int u)
{
vis[u]=;
for(int i=qhead[u];i!=-;i=query[i].next)
{
int v=query[i].v;
if(vis[v] && !mark[Find(v)]) //mark数组是为了针对非连通图的情况
ans[query[i].index]=dis[u]+dis[v]-*dis[Find(v)];
} for(int i=ehead[u];i!=-;i=e[i].next)
{
int v=e[i].v;
if(!vis[v])
{
dis[v]=dis[u]+e[i].w;
LCA(v);
p[v]=u;
}
}
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&c))
{
etot=qtot=;
memset(qhead,-,sizeof(qhead));
memset(ehead,-,sizeof(ehead));
for(int i=;i<=n;i++) p[i]=i; while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
} for(int i=;i<=c;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addQuery(u,v,i);
addQuery(v,u,i);
} memset(ans,-,sizeof(ans));
memset(vis,,sizeof(vis));
memset(mark,,sizeof(mark));
for(int i=;i<=n;i++)
{
if(!vis[i])
{
dis[i]=;
LCA(i);
mark[i]=;
}
}
for(int i=;i<=c;i++)
{
if(ans[i]==-) puts("Not connected");
else printf("%d\n",ans[i]);
}
}
return ;
}
HDU 2874 Connections between cities(LCA离线算法实现)的更多相关文章
- hdu 2874 Connections between cities [LCA] (lca->rmq)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- HDU 2874 Connections between cities (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...
- HDU 2874 Connections between cities(LCA)
题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...
- Hdu 2874 Connections between cities
题意: 城市 道路 没有环 不一定连通的树 求两城市的最短距离 设想一下就是很多小树 那好办 思路: lca离线算法 然后有个技巧就是 每次我们tarjan一棵树不是最后树的节点都访问过并且孩子全 ...
- hdu 2874 Connections between cities (并查集+LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu 2874 Connections between cities 带权lca判是否联通
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu 2874 Connections between cities(st&rmq LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- HDU——2874 Connections between cities
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
随机推荐
- mysql 开启profiling
mysql 开启profiling
- vertx打成jar包发布工程,访问静态页面
1:添加pom依赖,配置打包插件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...
- 问题解决 -------- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题 (2012-09-02 13:09:25) 转载▼ 标签: 杂谈 ...
- 浏览器内核控制标签meta说明
由于众所周知的原因,国内的主流浏览器都是双核浏览器:基于Webkit的内核用于常用网站的高速浏览,基于IE的内核主要用于部分网银.政府.办公系统等网站的正常使用.以360浏览器为例,我们优先通过Web ...
- Fenwick
hdu1394 这题说的是给了一个序列计算这个序列的逆序对总共要进行n次 每次都将目前的第一个放到序列的最后一个位置然后 计算一次逆序对 这样我们只需要先求一次逆序对 然后接着每次都用F=F+(n-T ...
- 使用Jmeter测试Dubbo接口(参数设置篇)
WebSocket接口需要下载dubbo插件才能使用 本次下载的版本为jmeter-plugins-dubbo-1.3.6,下载完成后jar文件放到\lib\ext目录下 由于工作需要,最近需要对du ...
- python 字符串的I/O 操作
想使用操作类文件对象的程序来操作文本或二进制字符串 使用io.StringIO() 和io.BytesIO() 类来创建类文件对象操作字符串数据 >>> s = io.StringI ...
- Request 对象 response 对象 常见属性
请求和响应 Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据. app.get('/', function (req, res) { // - ...
- spoj1825 Free tour II
题目链接 一道神奇的点分治 貌似有很多做法,我觉得BIT要好些一些(雾 要求经过黑点数<k就用BIT区间查询前缀 对于每个点用 BIT[0,k-经过黑点数]的最大值+路径长度 使用点分治做到O ...
- Android查缺补漏(View篇)--布局文件中的“@+id”和“@id”有什么区别?
Android布局文件中的"@+id"和"@id"有什么区别? +id表示为控件指定一个id(新增一个id),如: <cn.codingblock.vie ...