HDU 2196 树的直径
来源:互联网 发布:dotamax周报怎么看数据 编辑:程序博客网 时间:2024/04/28 07:52
到树上的任意节点最远的点一定是树的两个端点之一
要注意bfs判断端点的时候不能再用记最后出队元素的方法
因为边权是给定的 不一定为1
#include<algorithm>#include<stdio.h>#include<iostream>#include<vector>#include<queue>#define maxn 10005using namespace std;#define inf 1000000005vector<int>G[maxn];int vis[maxn];int d1[maxn],d2[maxn];int s,n;struct Edge{ int from,to,va;};vector<Edge>edges;void AddEdge(int from,int to,int va){ edges.push_back((Edge){from,to,va}); edges.push_back((Edge){to,from,va}); int k =(int)edges.size(); G[from].push_back(k-2); G[to].push_back(k-1);}void bfs(int *d,int &s){ for(int i=1;i<=n;++i) { d[i]=-1; vis[i]=0; } queue<int>q; q.push(s); vis[s]=1; d[s]=0; while(!q.empty()) { int k=q.front(); q.pop(); if(d[s]<d[k])s=k; //因为边权不一定为1 所以最后出队的元素不一定是端点 for(int i=0;i<G[k].size();++i) { Edge &x=edges[G[k][i]]; if(vis[x.to])continue; d[x.to]=d[k]+x.va; vis[x.to]=1; q.push(x.to); } }}int main(){ while(~scanf("%d",&n)) { memset(d1,0,sizeof d1); memset(d2,0,sizeof d2); int a,va; for(int i=2;i<=n;++i) { scanf("%d%d",&a,&va); AddEdge(i,a,va); } int t=1; bfs(d1,t); bfs(d1,t); bfs(d2,t); for(int i=1;i<=n;++i) {printf("%d\n",max(d1[i],d2[i]));} for(int i=0;i<=n;++i) {G[i].clear();} edges.clear(); } return 0;}
0 0
- HDU 2196 树的直径
- 树的直径 hdu 2196
- HDU 2196 Computer(树的直径)
- HDU 2196 Computer(树的直径)
- HDU 2196 Computer [树的直径]
- 【HDU】2196 - Computer(树的直径)
- HDU Problem 2196 Computer【树的直径】
- HDU 2196 Computer (树的直径)
- HDU 2196 Computer 【树的直径】
- hdu 3721 树的直径
- HDU 4607 树的直径
- 树的直径 hdu 4607
- hdu 2196 (通过树的直径来求的方法)
- HDU 2196 Computer(树的直径的模板题)
- Hdu 2196 Computer (树的直径 或 树形DP)
- 树的直径 poj1985 poj 1849 hdu 2196
- hdu 2196 Computer(树的直径\树上dp)
- hdu 2196 Computer 树形DP或者树的直径
- 黑马程序员:Socket编程之(UDP vs TCP)
- 线程池
- 自己的问题
- request获取地址url中各个部分的方法
- 读书摘要--Java程序设计8章:多线程
- HDU 2196 树的直径
- 香港游客亲睐‘周世黑鸭’
- Tomcat7源码阅读日记2
- 六种主流编程语言(C、C++、Python、JavaScript、PHP、Java)特性对比
- DOM4j 解析xml
- cocos2d-x学习笔记-CCMenu和CCMenuItem详解
- C++ 运算符重载
- 又是一种windows下用python的常见组合:pydev+eclipse
- 今天这样用枚举,自己都笑尿了