hdu2196
2016-03-06 15:59
246 查看
链接:点击打开链接
题意:求一棵树中每个节点距离其它节点的最大距离
代码:
题意:求一棵树中每个节点距离其它节点的最大距离
代码:
#include <vector> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; struct node{ int to,cost; }; vector<node> G[10005]; int n,dp[10005],vis[10005],dis[10005][5]; void dfs1(int s){ int i,tmp; for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(G[tmp].size()) dfs1(tmp); if(dis[tmp][0]+G[s][i].cost>dis[s][0]){ dis[s][0]=dis[tmp][0]+G[s][i].cost; vis[s]=tmp; } } for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(tmp!=vis[s]) dis[s][1]=max(dis[s][1],dis[tmp][0]+G[s][i].cost); } } //从下向上更新最长距离 void dfs2(int s){ int i,tmp; for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(tmp==vis[s]) //判断是否在父节点的最长路径上 dp[tmp]=max(dp[s],dis[s][1])+G[s][i].cost; else dp[tmp]=max(dp[s],dis[s][0])+G[s][i].cost; dfs2(tmp); } } //从上向下跟新最长距离 int main(){ //距离当前节点最远的点无非是向下找或者向上找 int i,j,x,y; //因此向下找最长距离就用一次dfs,向上找的最长 while(scanf("%d",&n)!=EOF){ //距离需要判断需要判断是否在当前父节点的最长路 memset(dp,0,sizeof(dp)); //径上,如果在则向上的最长距离为父节点的次长距 memset(dis,0,sizeof(dis)); //离加上两点的距离,否则为父节点的最长距离加上 memset(vis,0,sizeof(vis)); //两点的距离 for(i=1;i<=n;i++) G[i].clear(); for(i=2;i<=n;i++){ scanf("%d%d",&x,&y); G[x].push_back((node){i,y}); //建树 } dfs1(1); dfs2(1); for(i=1;i<=n;i++) printf("%d\n",max(dis[i][0],dp[i])); //比较向下的距离和向上的距离 } return 0; }
相关文章推荐
- 2809: [Apio2012]dispatching|splay启发式合并
- postgresql主备之the database system is starting up
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(57)-插件---ueditor使用
- 算法题目一:如果数组中数字重复最多的次数大于数组长度的一半,返回1,否则返回0
- n-1 个数中三个数乘积最大的最小公倍数
- sqlite3 笔记整理
- VS2015快捷键设置
- ZooKeeper架构及简介
- DeepLearning--Part3--Chapter16:Representation Learning(1) categories:
- 51nod 1347 旋转字符串
- JAVA帮助文档全系列说明
- Android实现后台每日定时更新操作实现知识点和思路
- 将txt文件内容导入sql server 数据库表中
- BigDecimal使用以及异常处理
- DeepLearning--Part2--Chapter6:Feedforward-Deep-Networks(1)
- Java类加载器
- Android UI优化
- 项目3:小试循环---(5)求m!
- Weblogic的Admin server进程将CPU消耗尽问题解决
- 表单与button问题