树的直径(图中最长路)——hiho 1050
2016-10-07 14:12
417 查看
题目链接:
https://hihocoder.com/problemset/problem/1050
分析:
给出一棵树,求出这棵树的直径(即最长的路)。 PS:每两个点之间只有一条边。
题解:
任意从一点开始DFS,找到它能到达的最远点,这一点肯定是树直径上的一个端点,再从这一点开始进行DFS,直到最远点,记录下中间的距离,这个最远点就是树的直径的另一个端点,这个距离即树的直径。
AC代码:
https://hihocoder.com/problemset/problem/1050
分析:
给出一棵树,求出这棵树的直径(即最长的路)。 PS:每两个点之间只有一条边。
题解:
任意从一点开始DFS,找到它能到达的最远点,这一点肯定是树直径上的一个端点,再从这一点开始进行DFS,直到最远点,记录下中间的距离,这个最远点就是树的直径的另一个端点,这个距离即树的直径。
AC代码:
/************************************************************************* > File Name: 1050.cpp > Author: Akira > Mail: qaq.febr2.qaq@gmail.com > Created Time: 2016年10月07日 星期五 13时16分45秒 ************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cmath> #include <vector> #include <set> #include <list> #include <ctime> typedef long long LL; typedef unsigned long long ULL; typedef long double LD; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Sqr(a) ((a)*(a)) using namespace std; #define MaxN 100000 #define MaxM MaxN*10 #define INF 0x3f3f3f3f #define bug cout<<88888888<<endl; #define MIN(x,y) (x<y?x:y) #define MAX(x,y) (x>y?x:y) int N; struct Edge { int u,v; int next; }edge[MaxM]; int head[MaxN]; int cont; void init() { MST(head, -1); cont = 0; } void add(int u, int v) { edge[cont].u = u; edge[cont].v = v; edge[cont].next = head[u]; head[u] = cont++; } void Add(int u, int v) { add(u, v); add(v, u); } int vis[MaxN]; int node; int level; void dfs(int x, int lel) { vis[x] = 1; //cout << x << "---" << lel << endl; if(lel > level) { node = x; level = lel; } for(int i = head[x]; i!=-1; i=edge[i].next) { int v = edge[i].v; //cout << v << "::" << vis[v] << endl; if(!vis[v]) dfs(v, lel+1); } } int main() { while(~scanf("%d", &N)) { init(); int a,b; for(int i=1;i<N;i++) { scanf("%d%d", &a, &b); Add(a, b); } CLR(vis); level = 0; dfs(1, 0); //cout << level << "-" << node << endl; CLR(vis); level = 0; dfs(node, 0); cout << level << endl; } }
相关文章推荐
- [HIHO1050]树中的最长路(树直径)
- hiho_1050_树中的最长路
- Hiho #1050 : 树中的最长路 【树的直径】
- hiho 1050 树中的最长路 (树的直径)
- #1050 : 树中的最长路(树的直径)
- hiho一下#1050 : 树中的最长路
- Hihocoder 1050 树中的最长路(树的直径 两次dfs/折点)
- hiho 1050 树中的最长路 (树的直径)
- [hiho 11]树的直径
- #1050 :求多叉树中的的最长路
- [HIHO] 1050 树中的最长路
- 树的直径(最长路) 的详细证明
- 树的直径(最长路)
- hihoCoder 1050 树中的最长路
- [hihocoder1050]树中的最长路
- HihoCoder-1050 【裸树的直径】
- hihoCoder 1050 树中的最长路 题解
- 第七周:[hihocoder]#1050 : 树中的最长路
- hihoCoder1050— 树中的最长路(深搜)
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)