说一下这道题的坑点吧:两次DFS求树最远的两个点的长度,那么其实我们可以从题目中读出来,所谓的交换机和终端电脑在这道题里除名字以外并无明显区别,那么我们可以考虑将所有的终端电脑当成交换机来考虑,一开始建图时将终端电脑编号直接跟在交换机之后,那么问题来了,题目中给的n和m的范围都在1到10000,我们处理时m的编号是在n之后的,那么取极限情况,n取10000,则m从10001开始编号,那么编号最多为10000+10000 = 20000,所以vector一定不能开小了。。。嗯。。以后无思路debug时一定先看看题目给的数据范围,考虑是不是数组开大或者开小了。。。别为了省空间让题做错了。。。
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;
int n, m;
int ans = 0, endd = 1;
vector<int> v[20001];
void dfs( int x, int end, int length)
{
int flag = 0;
for(int i = 0 ; i < (int)v[x].size() ; ++i)
{
if(v[x][i] != end)
{
flag = 1;
dfs( v[x][i], x, (length + 1));
}
}
if(!flag)
{
if(ans < length)
{
ans = length;
endd = x;
}
}
}
int main()
{
cin>>n>>m;
int num;
for(int i = 2 ; i <= n + m ; ++i)
{
cin>>num;
v[num].push_back(i);
v[i].push_back(num);
}
dfs(1, 0, 0);
dfs(endd, 0, 0);
cout<<ans;
}