Connections between cities HDU - 2874(最短路树 lca )
题意:
给出n个点m条边的图,c次询问 求询问中两个点间的最短距离。
解析:
Floyd会T,所以用到了最短路树。。具体思想为:
设k为u和v的最近公共祖先 d[i] 为祖结点到i的最短距离 则dis[u][v] = d[u] + d[v] - 2*d[k]
用tarjan的lca求即可
把这题代码当作模板就好啦
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff;
const int maxm = 1e6 + ;
int n, m, cnt1, cnt2, c;
int head1[maxn], head2[maxn], f[maxn], d[maxn], vis[maxn];
int res[maxm]; struct node
{
int v, w, next;
}Node[maxn*]; struct edge
{
int v, id, next;
}Edge[maxm*]; void add1_(int u, int v, int w)
{
Node[cnt1].v = v;
Node[cnt1].w = w;
Node[cnt1].next = head1[u];
head1[u] = cnt1++;
} void add1(int u, int v, int w)
{
add1_(u, v, w);
add1_(v, u, w);
} void add2_(int u, int v, int id)
{
Edge[cnt2].v = v;
Edge[cnt2].id = id;
Edge[cnt2].next = head2[u];
head2[u] = cnt2++;
} void add2(int u, int v, int id)
{
add2_(u, v, id);
add2_(v, u, id);
} int find(int x)
{
return f[x]==x?x:(f[x] = find(f[x]));
} int lca(int u, int deep, int root)
{
f[u] = u;
d[u] = deep;
vis[u] = root; // 标记属于的树
for(int i=head1[u]; i!=-; i=Node[i].next)
{
node e = Node[i];
if(vis[e.v] == -)
{
lca(e.v, deep+e.w, root);
f[e.v] = u;
}
}
for(int i=head2[u]; i!=-; i=Edge[i].next)
{
edge e = Edge[i];
if(vis[e.v] == root) //判断另一个结点是不是和u属于一个树
{
int k = find(e.v); //寻找最近公共祖先
res[e.id] = d[u] + d[e.v] - *d[k];
}
}
} void init()
{
mem(head1, -);
mem(head2, -);
mem(res, -);
mem(vis, -);
cnt1 = cnt2 = ;
} int main()
{
while(scanf("%d%d%d", &n, &m, &c) != EOF)
{
init();
rap(i, , m)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add1(u, v, w);
}
rap(i, , c)
{
int u, v;
scanf("%d%d", &u, &v);
add2(u, v, i);
}
rap(i, , n)
if(vis[i] == -)
lca(i, , i);
rap(i, , c)
{
if(res[i] == -) printf("Not connected\n");
else printf("%d\n", res[i]);
}
} return ;
}
Connections between cities HDU - 2874(最短路树 lca )的更多相关文章
- hdu 3409 最短路树+树形dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3409 参考博客:http://www.cnblogs.com/woaishizhan/p/318981 ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- 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判是否联通
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 (并查集+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 LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...
- HDU——2874 Connections between cities
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 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/327 ...
随机推荐
- [vijos1067]Warcraft III 守望者的烦恼
就是上次考得fyfy.竟然是原题... // It is made by XZZ #include<cstdio> #include<algorithm> #include&l ...
- javaweb(十)——HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- Django之视图系统
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的python函数(类),它接受web请求并返回web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,或者 ...
- oracle 查看锁表及解锁的语句
解锁语句: alter system kill session 'sid, serial#'; alter system kill session '23, 1647'; 查询那些对象被锁: sele ...
- 用python SMTP进行邮件发送
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart & ...
- 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...
- Windows 下在 Python (Anaconda) 中安装 Dlib 库
0. 引言 介绍在 Windows 操作系统下,在 Python 的 Anaconda 集成环境中,安装 Dlib 库 : 对于不了解源码编译的,或者利用 cmake 方法失败的,可以尝试下此方法: ...
- Gradle初使用
我以前一直使用Maven来构建工程,这两天突然发现gradle也非常好用,记录一下自己使用gradle的过程. Gradle的下载与配置 本次选择下载的是gradle3.5版本,没选最新的gradle ...
- ASCII码中的可见字符
ASCII码中 包括空格的可见字符从32到126共95个 不包括则为94
- Paper Reading - Show and Tell: A Neural Image Caption Generator ( CVPR 2015 )
Link of the Paper: https://arxiv.org/abs/1411.4555 Main Points: A generative model ( NIC, GoogLeNet ...