蓝桥杯-历届试题-大臣的旅费(经典树形DP)
2017-03-07 23:14
351 查看
//传送门: http://dasai.lanqiao.cn/ 常规方法 #include <queue> #include <functional> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <stack> #include <vector> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> #include <assert.h> using namespace std; #define N 100005 #define INF 0x3f3f3f3f struct edge { int v,dis,next; }e ; int head ; int dp [3]; //dp[i][0] 表示从子节点到 i 的最远距离,dp[i][1]表示从子节点到 i 的次远距离,dp[i][2]表示从父节点到 i 的最远距离 void dfs1(int u,int fa) { int a=0,b=0; for(int i=head[u];~i;i=e[i].next){ if(e[i].v == fa) continue; dfs1(e[i].v,u); int tmp = dp[e[i].v][0] + e[i].dis; if(tmp>a){ b=a; a=tmp; }else if(tmp>b){ b=tmp; } } dp[u][0] = a; dp[u][1] = b; } void dfs2(int u,int fa) { for(int i=head[u];~i;i=e[i].next){ int v = e[i].v; if(v == fa) continue; dp[v][2] = max(dp[v][1],dp[u][0]==dp[v][0]+e[i].dis?dp[u][1]:dp[u][0]); dfs2(v,u); } } int main() { //freopen("in.txt" ,"r",stdin); int n; scanf("%d",&n); int tot = 0; memset(head,-1,sizeof(head)); for(int i=0;i<n-1;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); e[tot].v=b; e[tot].dis=c; e[tot].next=head[a]; head[a]=tot++; e[tot].v=a; e[tot].dis=c; e[tot].next=head[b]; head[b]=tot++; } int ans = 0; dfs1(1,-1); dfs2(1,-1); for(int i=1;i<=n;i++){ ans = max(ans,dp[i][0]+dp[i][2]); } printf("%d\n",(1+ans)*ans/2+ans*10); return 0; }
相关文章推荐
- 蓝桥杯-历届试题-大臣的旅费(经典树形DP)
- 历届试题 大臣的旅费 树形DP
- 蓝桥杯 历届试题 大臣的旅费:两遍DFS/BFS (已AC)
- 蓝桥杯 历届试题 大臣的旅费
- 蓝桥杯 历届试题 大臣的旅费
- 蓝桥杯练习系统历届试题 大臣的旅费 求树的直径
- 转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]
- 蓝桥杯历届试题——大臣的旅费(图的最长路)
- 历届试题 大臣的旅费 蓝桥杯
- 蓝桥杯 历届试题 大臣的旅费 DFS两次
- 蓝桥杯 历届试题 大臣的旅费
- 蓝桥杯--- 历届试题 大臣的旅费 (DFS & Vector)
- 蓝桥杯 历届试题 大臣的旅费 (树的直径 BFS)
- 蓝桥杯历届试题 大臣的旅费(75分)
- 蓝桥杯历届试题 大臣的旅费 记忆化搜索DFS
- 蓝桥杯 历届试题 大臣的旅费 (两次dfs 之树上求最长路径)
- 蓝桥杯 - 历届试题 大臣的旅费
- 蓝桥杯 历届试题 大臣的旅费
- 蓝桥杯 历届试题 大臣的旅费
- 蓝桥杯-历届试题之大臣的旅费