Codevs 2370 小机房的树
来源:互联网 发布:手机盯盘软件 编辑:程序博客网 时间:2024/05/18 03:40
Codevs 2370 小机房的树
裸lca。
关于如何转化图有多种方法,我记录了 每个节点的父亲, 到父亲的距离, 深度。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int MAXN = 50000 + 50;int n, tot = 0;int first[MAXN], nxt[MAXN << 1], dis[MAXN], deep[MAXN], fa[MAXN];bool dfsed[MAXN];struct edge{ int from, to, cost;}es[MAXN << 1];void build(int ff, int tt, int dd){ es[++tot] = (edge){ff,tt,dd}; nxt[tot] = first[ff]; first[ff] = tot;}void dfs(int x){ for(int i = first[x]; i != -1; i = nxt[i]) { int v = es[i].to; if(!dfsed[v]) { dfsed[v] = 1; dis[v] = es[i].cost; deep[v] = deep[x] + 1; fa[v] = x; dfs(v); } }}int ask(int x, int y){ int ans = 0; if(deep[x] > deep[y]) swap(x,y); while(deep[y] != deep[x]) { ans += dis[y]; y = fa[y]; } while(x != y) { ans += dis[x]; ans += dis[y]; x = fa[x]; y = fa[y]; } return ans;}int main(){ cin >> n; memset(first,-1,sizeof(first)); for(int i = 1; i < n; i ++) { int f, t, d; scanf("%d%d%d", &f, &t, &d); build(f,t,d); build(t,f,d); } deep[0] = 1; dfsed[0] = 1; fa[0] = 0; dis[0] = 0x3f3f3f3f; dfs(0); int m; cin >> m; while(m --) { int x, y; scanf("%d%d", &x, &y); printf("%d\n",ask(x,y)); } return 0;}
0 0
- 【codevs 2370】小机房的树
- [LCA][CODEVS 2370]小机房的树
- Codevs 2370 小机房的树
- Codevs 2370 小机房的树
- 【codevs 2370】小机房的树
- Codevs 2370 小机房的树
- codevs 2370 小机房的树
- 【codevs 2370】小机房的树
- Codevs 2370 小机房的树
- 【codevs 2370】小机房的树
- codevs 2370小机房的树
- Codevs 2370 小机房的树
- codevs 2370 小机房的树 (lca)
- Codevs 2370 小机房的树
- codevs —— 2370 小机房的树 倍增LCA
- Codevs 2370 小机房的树 LCA 树上倍增
- codevs 2370 小机房的树(lca)
- codevs 2370 小机房的树 (LCA)
- jquery实现弹幕效果
- MySQL 运算符和函数
- POJ 2828 Buy Tickets 线段树 单点修改记录状态
- Y2K Accounting Bug
- 最近实现一个类似于微信通讯录的功能//
- Codevs 2370 小机房的树
- IE浏览器下调试javascript
- Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析
- 【PAT甲级】1006. Sign In and Sign Out (25)
- 优化OpenSearch的搜索结果
- C++中“Virtual outside class declaration ”解决办法
- MySQL 自定义函数
- RxJava实现异步任务的第三方框架
- [数据结构]基本概念和术语