HDU2586
2015-08-07 09:26
281 查看
最近的共同祖先反复问的问题。
#include <iostream> #include <algorithm> #include <vector> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 40000 + 10; struct Edge{ int to,cost; Edge(){}; Edge(int _to,int _cost) :to(_to),cost(_cost){}; }; vector<Edge> tree[MAXN]; vector<Edge> Qes[MAXN]; int degree[MAXN]; int f[MAXN]; bool vst[MAXN]; int dist[MAXN]; int ancestor[MAXN]; int ans[MAXN]; int rank[MAXN]; int N,M; void init(){ for(int i = 0;i <= N;++i){ degree[i] = 0; f[i] = i; ans[i] = -1; rank[i] = 0; dist[i] = 0; vst[i] = false; ancestor[i] = -1; tree[i].clear(); Qes[i].clear(); } } int Find(int x){ if(x == f[x]) return x; return f[x] = Find(f[x]); } void LCA(int u){ int sz = tree[u].size(); for(int i = 0;i < sz;++i){ Edge& e = tree[u][i]; if(!vst[e.to]){ vst[e.to] = 1; dist[e.to] = dist[u] + e.cost; LCA(e.to); f[e.to] = u; int k = Qes[e.to].size(); for(int j = 0;j < k;++j){ Edge& et = Qes[e.to][j]; if(vst[et.to]&&ans[et.cost] == -1){ //还未遍历到 if(et.to == e.to) ans[et.cost] = 0; else ans[et.cost] = dist[e.to] + dist[et.to] - 2*dist[Find(et.to)]; } } } } } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d%d",&N,&M); init(); int x,y,c; for(int i = 1;i < N;++i){ scanf("%d%d%d",&x,&y,&c); tree[x].push_back(Edge(y,c)); tree[y].push_back(Edge(x,c)); } for(int i = 0;i < M;++i){ scanf("%d%d",&x,&y); Qes[x].push_back(Edge(y,i)); Qes[y].push_back(Edge(x,i)); } vst[1] = 1; LCA(1); for(int i = 0;i < M;++i){ printf("%d\n",ans[i]); } } return 0; }
相关文章推荐
- redis、memcache、mongoDB有哪些区别?
- hdu 1885 Key Task(bfs+状态压缩)
- SQLServer 之 char、varchar、nvarchar的区别
- Objective-C基础语法快速入门
- 平时记录
- My Calculator
- 【机房合作】状态模式与上机
- php递归函数三种实现方法及如何实现数字累加
- 定时等待I/O
- Myeclipse2014中,新建部署Maven项目
- 转载_如何像巫师那样隔空操作——聊聊迷你雷达的原理和应用
- 南邮 OJ 1810 A. The more the better
- 关于singleInstance做的测试(亲测and接上篇文章继续测试)
- STL vector的简单用法
- Eclipse中问题大汇总及方案!
- J2EE--Servlet生命周期与原理
- 不一样的控制面板 GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
- PHP错误处理
- 如何在android style文件中使用自定义属性
- 创建mysql数据库