1021. Deepest Root (25)

1021. Deepest Root (25)
时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B
判题程序 Standard 作者 CHEN, Yue

A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N-1 lines follow, each describes an edge by given the two adjacent nodes’ numbers.
Output Specification:
For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print “Error: K components” where K is the number of connected components in the graph.
Sample Input 1:
5
1 2
1 3
1 4
2 5
Sample Output 1:
3
4
5
Sample Input 2:
5
1 3
1 4
2 5
3 4
Sample Output 2:
Error: 2 components

思路:针对每一个顶点u进行广度优先遍历即可

#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <vector>
#include <string>
#include <cfloat>
#include <queue>
#include <map>

typedef struct lnode
{
    int data;
    int next;
    lnode() { next = -1; }
}LNode;

using namespace std;
const int MaxN = 10010;
vector<int>G[MaxN];
vector<int> root;
bool isInq[MaxN];
int deep = 0;


void BFS(int st)
{
    queue<int> que, backque; que.push(st); isInq[st] = true; int tdeep = 0;
    while (que.size())
    {
        while (que.size())
        {
            int u = que.front(); que.pop();
            for (int i = 0; i < G[u].size(); ++i)
            {
                int v = G[u][i];
                if (!isInq[v])
                {
                    backque.push(v);
                    isInq[v] = true;
                }
            }
        }
        ++tdeep;
        swap(que, backque);
    }
    if (tdeep > deep)
    {
        root.clear();
        root.push_back(st);
        deep = tdeep;
    }
    else if (tdeep == deep)
        root.push_back(st);
}


int main()
{
#ifdef _DEBUG
    freopen("data.txt", "r+", stdin);
#endif // _DEBUG
    std::ios::sync_with_stdio(false);
    int n;
    cin >> n;
    for (int i = 1; i < n; ++i)
    {
        int u, v;
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }

    BFS(1); bool connected = true; int com = 1;
    for (int i = 2; i <= n; ++i)
    {
        if (!isInq[i])
        {
            connected = false;
            ++com;
            BFS(i);
        }
    }

    if (!connected)
    {
        cout << "Error: " << com << " components";
        return 0;
    }

    for (int i = 2; i <= n; ++i)
    {
        memset(isInq, 0, sizeof(isInq));
        BFS(i);
    }

    for (int i = 0; i < root.size(); ++i)
        cout << root[i] << endl;

    return 0;
}
# -*- coding: utf-8 -*- '''请在Begin-End之间补充代码, 完成BinaryTree类''' class BinaryTree: # 创建左右子树为空的根结点 def __init__(self, rootObj): self.key = rootObj # 成员key保存根结点数据项 self.leftChild = None # 成员leftChild初始化为空 self.rightChild = None # 成员rightChild初始化为空 # 把newNode插入到根的左子树 def insertLeft(self, newNode): if self.leftChild is None: self.leftChild = BinaryTree(newNode) # 左子树指向由newNode所生成的BinaryTree else: t = BinaryTree(newNode) # 创建一个BinaryTree类型的新结点t t.leftChild = self.leftChild # 新结点的左子树指向原来根的左子树 self.leftChild = t # 根结点的左子树指向结点t # 把newNode插入到根的右子树 def insertRight(self, newNode): if self.rightChild is None: # 右子树指向由newNode所生成的BinaryTree # ********** Begin ********** # self.rightChild = BinaryTree(newNode) # ********** End ********** # else: t = BinaryTree(newNode) t.rightChild = self.rightChild self.rightChild = t # ********** End ********** # # 取得右子树,返回值是一个BinaryTree类型的对象 def getRightChild(self): # ********** Begin ********** # return self.rightChild # ********** End ********** # # 取得左子树 def getLeftChild(self): # ********** Begin ********** # return self.leftChild # ********** End ********** # # 设置根结点的值 def setRootVal(self, obj): # 将根结点的值赋值为obj # ********** Begin ********** # self.key = obj # ********** End ********** # # 取得根结点的值 def getRootVal(self): # ********** Begin ********** # return self.key # ********** End ********** # # 主程序 input_str = input() nodes = input_str.split(',') # 创建根节点 root = BinaryTree(nodes[0]) # 插入左子树和右子树 if len(nodes) > 1: root.insertLeft(nodes[1]) if len(nodes) > 2: root.insertRight(nodes[2]) # 前三行输出:对创建的二叉树按编号顺序输出结点 print(root.getRootVal()) left_child = root.getLeftChild
最新发布
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值