博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 2874 Connections between cities(LCA)
阅读量:6659 次
发布时间:2019-06-25

本文共 2093 字,大约阅读时间需要 6 分钟。

题目大意:给出N个点。M条线,Q个询问,询问的是两点之间的最短距离

解题思路:恶心的数据量,一不小心就超空间了

这题给图不是张连通图,是森林,所以计算两点之间的最短距离时还要考虑一下是否在同一棵树中

剩下的就是裸LCA了

#include 
#include
#define N 10010#define M 20010#define C 2000010struct Edge{ int to, next, dis;}E[M];struct Edge2{ int to, next, w;}E2[C];int n, m, c, tot, tot2;int head[N], head2[N], dist[N], f[N], vis[N];void AddEdge(int u, int v, int dis) { E[tot].to = v; E[tot].next = head[u]; E[tot].dis = dis; head[u] = tot++; u = u ^ v; v = u ^ v; u = u ^ v; E[tot].to = v; E[tot].next = head[u]; E[tot].dis = dis; head[u] = tot++;}void AddEdge2(int u, int v) { E2[tot2].to = v; E2[tot2].next = head2[u]; E2[tot2].w = -1; head2[u] = tot2++; u = u ^ v; v = u ^ v; u = u ^ v; E2[tot2].to = v; E2[tot2].next = head2[u]; E2[tot2].w = -1; head2[u] = tot2++;}void init() { memset(head, -1, sizeof(head)); memset(head2, -1, sizeof(head2)); tot = tot2 = 0; int u, v, d; for (int i = 0; i < m; i++) { scanf("%d%d%d", &u, &v, &d); AddEdge(u, v, d); } for (int i = 0; i < c; i++) { scanf("%d%d", &u, &v); AddEdge2(u, v); } memset(vis, 0, sizeof(vis));}int find(int x) { return x == f[x] ? x : f[x] = find(f[x]);}void tarjan(int u, int time) { vis[u] = time; f[u] = u; int v; for (int i = head[u]; i != -1; i = E[i].next) { v = E[i].to; if (vis[v]) continue; dist[v] = dist[u] + E[i].dis; tarjan(v, time); f[v] = u; } for (int i = head2[u]; i != -1; i = E2[i].next) { v = E2[i].to; if (vis[v] == time) E2[i].w = E2[i^1].w = dist[u] + dist[v] - 2 * dist[find(v)]; }}void solve() { int cnt = 1; for (int i = 1; i <= n; i++) { if (!vis[i]) { dist[i] = 0; tarjan(i, cnt); } cnt++; } for (int i = 0; i < tot2; i += 2) { if (E2[i].w == -1) printf("Not connected\n"); else printf("%d\n", E2[i].w); }}int main() { while (scanf("%d%d%d", &n, &m, &c) != EOF) { init(); solve(); } return 0;}

转载地址:http://gtqto.baihongyu.com/

你可能感兴趣的文章
VC中的学习点滴
查看>>
有趣的数
查看>>
浏览器沙盒是什么
查看>>
Populating Next Right Pointers in Each Node
查看>>
WPF的消息机制(一)- 让应用程序动起来
查看>>
lightOJ 1172 Krypton Number System(矩阵+DP)
查看>>
DotNetBar 6.1 破解
查看>>
ubuntu下登录mysql
查看>>
3.0+百度地图在地图初始化的时候就弹框展示一个信息框,而不是用户点击poi时才弹出...
查看>>
第一部分 mongodb 基础篇
查看>>
emacs之配置4,颜色插件
查看>>
emmet语法
查看>>
[效率提升]工作中的那些命令行
查看>>
citus 多租户应用开发(来自官方文档)
查看>>
java鼠标双击和右键事件处理
查看>>
hash算法
查看>>
聊聊.net程序设计——浅谈使用VS2010建模拓展(上)[转]
查看>>
Archlinux下给T43添加Win键(Super键)
查看>>
Objective-C——消息、Category和Protocol
查看>>
Python 3.x中maketrans和translate用法
查看>>