CCF201503-4 网络延时

说一下这道题的坑点吧:两次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;
}

发布了10 篇原创文章 · 获赞 4 · 访问量 238

猜你喜欢

转载自blog.csdn.net/weixin_41414657/article/details/88557383
今日推荐