PAT--1021 Deepest Root(DFS记录从某个结点开始的最长路径)

题意:连通无环图是一个树,且图中任意一个结点都可以看作是树的根结点,以不同的结点为根结点,树的高度可能不同,要求输出层数最大的树的根节点编号。
思路:从各个结点开始分别用DFS遍历一次,记录最长的路径值,这个值就是以这个结点为根的树的高度。刚开始用邻接矩阵存储图,内层爆了。
总结:结点数小于等于1000可以用邻接矩阵,本题结点数小于等于10000,使用邻接链表做。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

bool visited[10001];
int maxdis;
int list[10001];    //存储以每个结点为根的树的高度
vector<int> edges[10001];

void dfs(int x, int cnt)
{
    visited[x] = true;
    int next;
    for(int i = 0; i < edges[x].size(); i++)
    {
        next = edges[x][i];
        if(!visited[next])
            dfs(next, cnt+1);
    }
    //下面的语句可以记录最长的路径
    if(cnt > maxdis) 
        maxdis = cnt;
}

int main()
{
    int n, a, b;
    cin >> n;
    for(int i = 1; i <= n; i++)
        edges[i].clear();
    for(int i = 0; i < n-1; i++)
    {
        cin >> a >> b;
        edges[a].push_back(b);
        edges[b].push_back(a);
    }

    int compnents = 0;
    memset(visited, 0, sizeof(visited));
    for(int i = 1; i <= n; i++)
        if(!visited[i])
        {
            dfs(i, 1);
            compnents++;
        }
    if(compnents != 1)
    {
        cout << "Error: "<< compnents << " components" << endl;
        return 0;
    }

    bool flag = false;
    int max = 0;
    for(int i = 1; i <= n; i++)
    {
        memset(visited, 0, sizeof(visited));
        maxdis = 1;
        dfs(i, 1);
        list[i] = maxdis;
        if(max < maxdis)
            max = maxdis;
    }

    for(int i = 1; i <= n; i++)
        if(list[i] == max)
            cout << i << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mch2869253130/article/details/88092945