POJ 1986 Distance Queries tarjan求LCA
2016-05-05 22:38
459 查看
题目:http://poj.org/problem?id=1986
题意:给定一个树,求树上两点间的最短距离
思路;tarjan求LCA,然后dist[v,u] = dist[v] + dist[u] - 2 * dist[LCA(v,u)]
总结:不知输入数据里的字母是什么鬼。。。
题意:给定一个树,求树上两点间的最短距离
思路;tarjan求LCA,然后dist[v,u] = dist[v] + dist[u] - 2 * dist[LCA(v,u)]
总结:不知输入数据里的字母是什么鬼。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 40010; typedef long long ll; struct edge { int to, cost, next; }G1[N*2]; struct node { int to, ind, next; }G2 ; int head1 , head2 , par ; int cnt1, cnt2; ll dist , res ; bool vis ; int n, m; void init() { for(int i = 1; i <= n; i++) par[i] = i; memset(head1, -1, sizeof head1); memset(head2, -1, sizeof head2); memset(vis, 0, sizeof vis); cnt1 = cnt2 = 0; } void add_edge1(int v, int u, int c) { G1[cnt1].to = u; G1[cnt1].cost = c; G1[cnt1].next = head1[v]; head1[v] = cnt1++; } void add_edge2(int v, int u, int ind) { G2[cnt2].to = u; G2[cnt2].ind = ind; G2[cnt2].next = head2[v]; head2[v] = cnt2++; } int ser(int x) { int r = x, i = x, j; while(r != par[r]) r = par[r]; while(i != r) j = par[i], par[i] = r, i = j; return r; } void tarjan_lca(int v) { vis[v] = true; int u; for(int i = head1[v]; i != -1; i = G1[i].next) if(!vis[u = G1[i].to]) { dist[u] = dist[v] + G1[i].cost; tarjan_lca(u); par[u] = v; } for(int i = head2[v]; i != -1; i = G2[i].next) if(vis[u = G2[i].to]) res[G2[i].ind] = dist[v] + dist[u] - 2 * dist[ser(u)]; } int main() { int k, a, b, c; char ch; while(~scanf("%d%d", &n, &m)) { init(); for(int i = 0; i < m; i++) { scanf("%d%d%d %c", &a, &b, &c, &ch); add_edge1(a, b, c); add_edge1(b, a, c); } scanf("%d", &k); for(int i = 0; i < k; i++) { scanf("%d%d", &a, &b); add_edge2(a, b, i); add_edge2(b, a, i); } dist[1] = 0; tarjan_lca(1); for(int i = 0; i < k; i++) printf("%lld\n", res[i]); } return 0; }
相关文章推荐
- UITextField限制汉字数量最正确的姿势,解决iOS7下substringToIndex方法导致的崩溃
- UITouch
- FluentData 学习 第一弹
- 通过key-value更改按钮的圆角
- Addressing Complex and Subjective Product-Related Queries with Customer Reviews-www2016-20160505
- 【BZOJ 1568】【JSOI 2008】Blue Mary开公司
- 实用知识:<AddressBookUI/AddressBookUI.h>(获取手机通讯录)
- Android stuido快捷键集合
- Top K Frequent Elements
- Android Bluetooth(蓝牙)实例
- 【LeetCode-334】Increasing Triplet Subsequence
- Hbuilder适配问题
- [iOS]详解调整UIButton的title和image的位置
- 通过UIWindow创建状态栏的通知
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
- leetcode_095 Unique Binary Search Trees II
- Android基础 | UI检视利器:Hierarchy Viewer
- String、StringBuffer与StringBuilder之间区别
- “java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp”