POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 16648 | Accepted: 5817 | |
Case Time Limit: 1000MS |
Description
Input
* Line 2+M: A single integer, K. 1 <= K <= 10,000
* Lines 3+M..2+M+K: Each line corresponds to a distance query and contains the indices of two farms.
Output
Sample Input
- 7 6
- 1 6 13 E
- 6 3 9 E
- 3 5 7 S
- 4 1 3 N
- 2 4 20 W
- 4 7 2 S
- 3
- 1 6
- 1 4
- 2 6
Sample Output
- 13
- 3
- 36
Hint
题意概括:
输入:
第一行输入结点数 N 和 边数 M。
接下来 M 行输入边的信息:起点 u 终点 v 距离 w 方向 s
输入查询数 K
接下来 K 行 输入查询值: 起点 u,终点 v;
解题思路:
一个有向无环图,当作一棵树来处理,根结点随意,假设为 1;
LCA 两点最短距离 老套路。
AC code:
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <cstring>
- #define INF 0x3f3f3f3f
- #define LL long long
- using namespace std;
- const int MAXN = 5e5+;
- struct Edge{int v, w, nxt;}edge[MAXN<<];
- struct Query
- {
- int v, id;
- Query(){};
- Query(int _v, int _id):v(_v),id(_id){};
- };
- vector<Query> q[MAXN];
- int head[MAXN], cnt;
- int dis[MAXN];
- int fa[MAXN];
- bool vis[MAXN];
- int ans[MAXN];
- int N, M, K;
- void init()
- {
- memset(vis, false, sizeof(vis));
- memset(head, -, sizeof(head));
- memset(dis, , sizeof(dis));
- memset(ans, , sizeof(ans));
- for(int i = ; i <= N; i++) q[i].clear();
- cnt = ;
- }
- int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
- void AddEdge(int from, int to, int weight)
- {
- edge[cnt].v = to;
- edge[cnt].w = weight;
- edge[cnt].nxt = head[from];
- head[from] = cnt++;
- }
- void dfs(int s, int f)
- {
- int root = s;
- for(int i = head[s]; i != -; i = edge[i].nxt){
- if(edge[i].v == f) continue;
- dis[edge[i].v] = dis[root] + edge[i].w;
- dfs(edge[i].v, s);
- }
- }
- void Tarjan(int s, int f)
- {
- int root = s;
- fa[s] = s;
- for(int i = head[s]; i != -; i = edge[i].nxt){
- int Eiv = edge[i].v;
- if(Eiv == f) continue;
- Tarjan(Eiv, root);
- fa[getfa(Eiv)] = root;
- }
- vis[s] = true;
- for(int i = ; i < q[s].size(); i++){
- if(vis[q[s][i].v] && ans[q[s][i].id] == ){
- ans[q[s][i].id] = dis[q[s][i].v] + dis[s] - *dis[getfa(q[s][i].v)];
- }
- }
- }
- int main()
- {
- scanf("%d%d", &N, &M);
- init();
- char s;
- for(int i = , u, v, w; i <= M; i++){
- scanf("%d%d%d %c", &u, &v, &w, &s);
- AddEdge(u, v, w);
- AddEdge(v, u, w);
- }
- scanf("%d", &K);
- for(int i = , u, v; i <= K; i++){
- scanf("%d%d", &u, &v);
- q[u].push_back(Query(v, i));
- q[v].push_back(Query(u, i));
- }
- dfs(, -);
- Tarjan(, -);
- for(int i = ; i <= K; i++){
- printf("%d\n", ans[i]);
- }
- return ;
- }
POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】的更多相关文章
- poj 1986 Distance Queries 带权lca 模版题
Distance Queries Description Farmer John's cows refused to run in his marathon since he chose a pa ...
- POJ.1986 Distance Queries ( LCA 倍增 )
POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...
- POJ 1986 Distance Queries LCA两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
- POJ 1986 Distance Queries(LCA Tarjan法)
Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...
- POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]
题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...
- poj 1986 Distance Queries LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
- poj 1986 Distance Queries(LCA)
Description Farmer John's cows refused to run in his marathon since he chose a path much too long fo ...
随机推荐
- MHA 高可用架构部署
一, MHA 介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公 ...
- Linux软件安装的补充
1 使用yum 命令查看软件提供的版本 yum list mysql* 然后比如说都需要安装我们就可以执行命令: yum install mysql* 然后就会安装所有的.会显示所有需要安装的包,和需 ...
- 迪米特法則 Law of Demeter
又稱為"最小知識"原則, 若對Law of Demeter做一個簡單總結: 任何對象的任何方法只能調用以下對象中的方法: (1) 該對象本身 (2) 所傳入的參數對象 (3) 它所 ...
- yum安装git
此方法对于RHEL.Fedora.CentOS有效: 1.yum install git 2.yum istall git-svn git-email git-gui gitk
- nyoj 61——传纸条(一)——————【双线dp】
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- select操作大全
每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...
- CheckBox 样式
.cb td { width: 100px; } .cb label { display: inline-block; ...
- c#做的查找文件夹内内容的小工具
第一次写博客有点激动啊QAQ 来新单位,一直没活干,公司代码控制器太多,其中有很多文件夹,每次找一个控制器都老找不到,我又不愿意用VS的全局搜索,想着没事就做了个查找控制器的小工具.代码如下: 先添加 ...
- C# 面向对象多态的抽象性&接口 object&is as类型转换运算符
抽象类/抽象方法 abstract 抽象的数据类型 抽象类不能被实例化 抽象类中不一定存在抽象方法 抽象方法一定是在抽象类中 抽象类里可以放任意的方法 接口 interface 不是类,就是用来当爹 ...