PAT (Advanced) 1021. Deepest Root (25)

来源:互联网 发布:淘宝云客服登录网址 编辑:程序博客网 时间:2024/05/20 18:54

原题:1021. Deepest Root (25)




解题思路:

1.第一步采用广度优先遍历计算连通分量数目。

2.若连通分量只有一个,对所有的点进行广度优先搜索,每次返回对应的树的最大深度,最后把深度最大的树的根输出

注:题目数据较大,用邻接表存储图。


C++代码如下:

#include<cstdio>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxn = 10010;struct Node{    int depth;    vector<int> next;} G[maxn];vector<int> ans; //结果int vis[maxn];//广度优先遍历int BFS(int index){   queue<int> Q;   int level = 0;   Q.push(index);   G[index].depth = 1; //根的深度为1   vis[index] = 1;   while(!Q.empty())   {       int top = Q.front();       Q.pop();       level = max(level, G[top].depth); //刷新最大深度       for(int i = 0; i < G[top].next.size(); i++)       {           if(vis[G[top].next[i]] == 0)            {                vis[G[top].next[i]] = 1;                G[G[top].next[i]].depth = G[top].depth + 1; //下一个点的深度等于当前深度加1                Q.push(G[top].next[i]);            }       }   }   return level;}int main(){    int n;    while(scanf("%d", &n) != EOF)    {        for(int i = 0; i < n - 1; i++)        {            int a, b;            scanf("%d%d", &a, &b);            G[a].next.push_back(b);            G[b].next.push_back(a);        }        int maxLevel = 0;        int nowLevel;        int cnt = 0;        //先判断连通分量个数        fill(vis, vis + n + 1, 0);        for(int i = 1; i <= n; i++)        {            if(vis[i] == 0)            {                nowLevel = BFS(i);                cnt++;            }        }        if(cnt > 1) //连通分量大于一个        {            printf("Error: %d components\n", cnt);        }        else //否则        {            //对每个点都计算一次生成树的深度            for(int i = 1; i <= n; i++)            {                fill(vis + 1, vis + n + 1, 0);                nowLevel = BFS(i);                if(nowLevel > maxLevel)                {                    //当前的深度更大                    //更新ans内的内容                    maxLevel = nowLevel;                    ans.clear();                    ans.push_back(i);                }                else if(nowLevel == maxLevel)                    //相等则加入                    ans.push_back(i);            }            //由于是从小到大计算的,直接输出即可            for(int i = 0; i < ans.size(); i++)                printf("%d\n", ans[i]);        }    }    return 0;}