这道题主要就是两次找最长路。
第一次找的最长路的终点一定是s,t中的一个。
代码:
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
vector<int>G[100010];
int vis[100010];
int MAX;
int K;//记录s-t中的一个
void dfs(int u,int len)
{
if(len>MAX)
{
MAX=len;
K=u;
}
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(!vis[v])
{
dfs(v,len+1);
}
}
}
int main()
{
int n,u,v;
scanf("%d",&n);
for(int i=1;i<=n;i++)
G[i].clear();
memset(vis,0,sizeof(vis));
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
MAX=0;
dfs(1,0);
memset(vis,0,sizeof(vis));
MAX=0;
dfs(K,0);
cout<<MAX<<endl;
}