首页 > 代码库 > hdu 2196(树的最长链)
hdu 2196(树的最长链)
题意:输出从一颗树中所有结点出发可以走的最长的路。
思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <math.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #define MP(a, b) make_pair(a, b) 14 #define PB(a) push_back(a) 15 using namespace std; 16 17 const int LEN = 10010; 18 const int INF = 0x3f3f3f3f; 19 typedef pair<int, int> pii; 20 vector<pii> Map[LEN]; 21 int n, vis[LEN], dis[LEN], disa[LEN]; 22 23 24 int bfs(int v){ 25 queue<int> q; 26 memset(vis, 0, sizeof vis); 27 memset(dis, 0, sizeof dis); 28 q.push(v); 29 vis[v] = 1; 30 while(!q.empty()){ 31 int nv = q.front(); q.pop(); 32 for(int i=0; i<Map[nv].size(); i++){ 33 int x = Map[nv][i].first; 34 if(!vis[x]){ 35 vis[x] = 1; 36 dis[x] = dis[nv] + Map[nv][i].second; 37 q.push(x); 38 } 39 } 40 } 41 int maxv = -INF, maxn; 42 for(int i=0; i<n; i++){ 43 if(maxv < dis[i]){ 44 maxv = dis[i]; 45 maxn = i; 46 } 47 } 48 return maxn; 49 } 50 51 int main() 52 { 53 // freopen("in.txt","r",stdin); 54 // freopen("out.txt","w",stdout); 55 56 int a, b; 57 while(scanf("%d", &n)!=EOF){ 58 for(int i=0; i<LEN; i++) Map[i].clear(); 59 for(int i=1; i<n; i++){ 60 scanf("%d%d", &a, &b); 61 a--; 62 Map[i].PB(MP(a, b)); 63 Map[a].PB(MP(i, b)); 64 } 65 int vexa = bfs(0); 66 int vexb = bfs(vexa); 67 for(int i=0; i<n; i++)disa[i] = dis[i]; 68 bfs(vexb); 69 for(int i=0; i<n; i++){ 70 printf("%d\n", max(disa[i], dis[i])); 71 } 72 } 73 return 0; 74 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。