hdu 4679 Terrorist’s destroy(树形dp)
来源:互联网 发布:农村淘宝 土豪村 编辑:程序博客网 时间:2024/06/05 15:27
题目链接:hdu 4679 Terrorist’s destroy
代码
#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>using namespace std;typedef pair<int,int> pii;const int maxn = 100005;const int inf = 0x3f3f3f3f;int N, W[maxn], L[maxn], R[maxn], D[maxn];vector<pii> G[maxn];void init () { scanf("%d", &N); for (int i = 1; i <= N; i++) G[i].clear(); int u, v; for (int i = 1; i < N; i++) { scanf("%d%d%d", &u, &v, &W[i]); G[u].push_back(make_pair(v, i)); G[v].push_back(make_pair(u, i)); L[i] = R[i] = -inf; }}int solve(int& s, int& e) { memset(D, inf, sizeof(D)); D[1] = 0; queue<int> que; que.push(1); while (!que.empty()) { s = que.front(); que.pop(); for (int i = 0; i < G[s].size(); i++) { int v = G[s][i].first; if (D[v] > D[s] + 1) { D[v] = D[s] + 1; que.push(v); } } } memset(D, inf, sizeof(D)); D[s] = 0; que.push(s); while (!que.empty()) { e = que.front(); que.pop(); for (int i = 0; i < G[e].size(); i++) { int v = G[e][i].first; if (D[v] > D[e] + 1) { D[v] = D[e] + 1; que.push(v); } } } return D[e];}int dep[maxn], son[maxn], len[maxn], idx[maxn];void dfs(int u, int f) { dep[u] = dep[f] + 1; son[u] = 0; len[u] = dep[u]; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].first; if (v == f) continue; dfs(v, u); if (len[v] > len[u]) { son[u] = v; idx[u] = G[u][i].second; len[u] = len[v]; } } //printf("%d %d %d\n", u, son[u], idx[u]);}void dfs(int u, int f, int deter, int id, int* a) { if (u == 0) return; a[id] = max(a[id], deter); int k = dep[u]; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].first; if (v == f || v == son[u]) continue; k = max(k, dep[v]); } dfs(son[u], u, max(deter, k), idx[u], a);}int main () { int cas; scanf("%d", &cas); for (int kcas = 1; kcas <= cas; kcas++) { init(); int s, e; int deter = solve(s, e); dep[0] = -1; dfs(s, 0); dfs(s, 0, 0, 0, L); dep[0] = -1; dfs(e, 0); dfs(e, 0, 0, 0, R); int ans = inf, id = 0, x; for (int i = 1; i < N; i++) { if (L[i] < 0 || R[i] < 0) x = deter; else x = max(L[i], R[i]); if (x * W[i] < ans) { ans = x * W[i]; id = i; } } printf("Case #%d: %d\n", kcas, id); } return 0;}
0 0
- HDU 4679 Terrorist’s destroy (树形DP)
- HDU 4679 Terrorist’s destroy(树形dp | 多校8)
- hdu 4679 Terrorist’s destroy (树形dp)
- hdu 4679 Terrorist’s destroy(树形dp)
- hdu 4679 Terrorist’s destroy ( 树形dp 树的直径 )
- 树形DP 2013多校8(Terrorist’s destroy HDU4679)
- hdu4679 Terrorist’s destroy(树形dp)
- hdu 4679 Terrorist’s destroy 树形dp水题 (2013多校联合)
- 【解题报告】HDU 4679 Terrorist’s destroy -- 树形dp 删一边求两子树直径
- HDU 4679 Terrorist’s destroy
- HDU 4679 Terrorist’s destroy
- HDU 4679 Terrorist’s destroy
- hdu 4679 Terrorist’s destroy
- hdu-4679-Terrorist’s destroy
- hdu 4679Terrorist’s destroy
- HDU 4679 Terrorist’s destroy
- HDU 4679 Terrorist’s destroy【Tree】
- HDU 4679 Terrorist’s destroy 解题报告
- 基于Dubbo框架构建分布式服务(顶)
- 杭电-1233还是畅通工程(kruskal,prim)
- http和https的区别
- ASP.NET的几个试题(《C#与.NET程序员面试宝典》)
- 【鸟哥的linux私房菜-学习笔记】进程管理
- hdu 4679 Terrorist’s destroy(树形dp)
- Java学习基础入门
- Leetcode149: Surrounded Regions
- hdu 4686 Arc of Dream(矩阵快速幂)
- LeetCode---Majority Element II
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- 抽象类 接口
- java里面的枚举
- Java生成MD5字符串