题目连接 http://hihocoder.com/problemset/problem/1050
看了网上的代码,自己理解了一下,两次dfs, 第一次找到最长路的出发点, 第二次找到最长路。
#include <iostream>
#include <cstdio>#include <cstring>
#include <map>
#include <algorithm>
#include <sstream>
#include <cctype>
#include <set>
#include <string>
#include <stack>
#include <vector>
using namespace std;
const int N = 100005;
const int inf = 0x3f3f3f3f;
vector<int> G[100005];
bool vis[100005];
int Max , k;
void Find(int u, int len)
{
vis[u] = true;
if(G[u].size() == 1 && len > Max)
{
Max = len;
k = u;
}
for(int i = 0; i < G[u].size(); i++)
{
if(!vis[G[u][i]])
{
Find(G[u][i], len + 1);//非常好用的递归
}
}
}
int main()
{
int n, u ,v;
scanf("%d", &n);
memset(G, 0 ,sizeof(G));
for(int i = 1; i<n; i++)
{
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
memset(vis, false, sizeof(vis));
Max = 0;
Find(1, 0);//这里的1可以是1到n的任意的数
Max = 0;
memset(vis, false, sizeof(vis));
Find(k, 0);
printf("%d\n", Max);
return 0;
}