Hihocoder 1050 树中的最长路(树的直径 两次dfs/折点)
2017-01-14 16:17
615 查看
两次dfs:
#include <iostream> #include <cstdio> #include <string.h> #include <queue> using namespace std; int vis[101000]; int head[101000]; int cnt; struct node{ int y; int next; }; node e[300000]; void insert(int i,int j){ e[cnt].y = j; e[cnt].next = head[i]; head[i] = cnt++; } int start;// 第二次dfs时开始的点 int depth; int dfs(int t,int i){ vis[i] = 0; int temp = head[i]; int a = 0; while(temp != -1){ if(vis[e[temp].y] == -1) a = max(a,dfs(t+1,e[temp].y)); temp = e[temp].next; } if(a == 0){ if(t > depth){ start = i; depth = t; } return t; } return a; } int main(){ int n; cin>>n; memset(head,-1,sizeof(head)); memset(vis,-1,sizeof(vis)); int a,b; for(int i = 1;i < n;i++){ scanf("%d%d",&a,&b); insert(a,b); insert(b,a); } dfs(0,1); memset(vis,-1,sizeof(vis)); int res; res = dfs(0,start); printf("%d\n",res); }
折点:
#include <iostream> #include <cstdio> #include <string.h> #include <queue> using namespace std; int head[101000]; int cnt; struct node{ int y; int next; }; node e[300000]; void insert(int i,int j){ e[cnt].y = j; e[cnt].next = head[i]; head[i] = cnt++; } int res = 0; int dfs(int t,int i){ int temp = head[i]; if(head[i] == -1){ return t; } priority_queue<int> q; while(temp != -1){ q.push(dfs(t+1,e[temp].y)); temp = e[temp].next; } int a = q.top(),b = 0; q.pop(); if(!q.empty()){ b = q.top(); res = max(res,a+b-2*t); } else{ res = max(res,a-t); } return a; } int main(){ int n; cin>>n; memset(head,-1,sizeof(head)); int a,b; for(int i = 1;i < n;i++){ scanf("%d%d",&a,&b); if(a > b) swap(a,b); insert(a,b); } dfs(0,1); printf("%d\n",res); }
相关文章推荐
- hihoCoder 1050 树中的最长路 题解
- [HIHO1050]树中的最长路(树直径)
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)
- 分治 hihoCoder1050 树中的最长路
- hihocoder-1050 树中的最长路(dfs)
- hihoCoder1050— 树中的最长路(深搜)
- HOJ 1030 Labyrinth----------------两次BFS求树的直径(图的最长路)
- 树的直径(图中最长路)——hiho 1050
- #1050 : 树中的最长路(树的直径)
- #1050 : 树中的最长路(两次BFS)
- 第七周:[hihocoder]#1050 : 树中的最长路
- hihocoder#1050之树中最长路
- hihocoder1050 : 树中的最长路
- [hihocoder1050]树中的最长路
- hihocoder#1050之树中最长路
- hihoCoder 1050 树中的最长路
- POJ 1985 Cow Marathon(两次BFS求树的直径(最长路))
- HihoCoder-1050 【裸树的直径】
- hiho_1050_树中的最长路
- HDU 4607 Park Visit 两次DFS求树直径