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 ...
随机推荐
- 【CF908G】New Year and Original Order
[CF908G]New Year and Original Order 题面 洛谷 题解 设\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界 ...
- Yii 2.0 使用片段缓存
网站首页footer中的菜单标题是从数据库读取并显示处理的. 也就是 <footer>标题里面是foreach.这样每个人打开网站就查询遍历效率会很低. <footer class= ...
- Redis5.0:现公测全免费,点击就送,注册账号,即开即用
华为云分布式缓存服务Redis,是华为云服务的一款核心产品. 分布式缓存Redis是一款内存数据库服务,基于双机热备的高可用架构,提供单机.主从.集群等丰富类型的缓存类型. 现推出最新版本Redis5 ...
- PytorchZerotoAll学习笔记(二)--梯度下降之手动求导
梯度下降算法: 待优化的损失值为 loss,那么我们希望预测的值能够很接近真实的值 y_pred ≍ y_label 我们的样本有n个,那么损失值可以由一下公式计算得出: 要使得los ...
- rhel6 mysql skip-grant-tables 添加用户报错 ERROR 1290
不小心把数据库密码忘掉了, 这个时候我们只需要在数据库的配置文件里面添加 skip-grant-tables 然后重新启动服务,再登录数据库就不要我们输入密码了 这个时候我成功登录数据,可是不小心又把 ...
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- 01—为什么使用java
Java解决的问题 1.指针问题 java里面没有指针,用引用解决指针问题,但是引用是一种限制的指针,不能参与整数运行和指向任意位置的内存,并且不用显示回收对象 引用地址:http://blog.cs ...
- 软工实践 - 第三十次作业 Beta答辩总结
福大软工 · 第十二次作业 - Beta答辩总结 组长本次博客作业链接 项目宣传视频链接 本组成员 1 . 队长:白晨曦 031602101 2 . 队员:蔡子阳 031602102 3 . 队员:陈 ...
- Alpha冲刺——第九天
Alpha第九天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...