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 ...
随机推荐
- OC convertRect
举个例子: redView = [[UIView alloc]initWithFrame:CGRectMake(50, 100, 100, 100)]; redView.backgroundColor ...
- [LeetCode] 589. N-ary Tree Preorder Traversal_Easy
Given an n-ary tree, return the preorder traversal of its nodes' values. For example, given a 3-ary ...
- 获取多达 16GB 的 Dropbox 免费空间!
Dropbox官网
- Pycharm上python3运行unittest无法生成测试报告
原文地址https://www.cnblogs.com/yoyoketang/p/7523409.html 前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告:为什么别人 ...
- rabbitmq_坑
一.None of the specified endpoints were reachable 这个异常在创建连接时抛出(CreateConnection()),原因一般是ConnectionF ...
- 不用中间变量交换a 和b的值
// 不用中间变量的写法 ,假如 a=13, b=8; a=a+b =21; //此时 a=21; b=8; b=a-b=13; //此时a=21; b=13; a=a-b=8; //相当于 a=21 ...
- Yii2 配置 Nginx 伪静态
主要检查以下代码: location / { # Redirect everything that isn't a real file to index.php try_files $uri $uri ...
- Ignite缓存大小管理
Ignite使用计算机内存存储缓存数据,达到提升缓存读写性能的.但是计算机内存往往是有限的,我们必须合理管理Ignite对内存的使用. Ignite可以使用JVM堆外内存和堆内内存.使用堆外内存基本上 ...
- python-正则表达式练习题
1.匹配一行文字中的所有开头的字母内容 #coding=utf-8 import re s="i love you not because of who you are, but becau ...
- MySQL数据库----安装
一.基础部分 1.数据库是什么 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组 ...