1021 Deepest Root (25)(25 分)(C++)

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

题目大意:给一个图,首先判断是否为连通图,若非连通图,则分为几个部分?若是连通图,那么以哪些节点为根节点建造的树度最大,输出这几个根节点。

解题思路:读题我们不难发现,判断是否为连通图以及计算以某个节点为根节点的树的度,都可以用DFS解决。首先第一遍DFS判断是否为连通图,思想在之前的题目中也有体现。若为连通图,则我们输出所有达到maxheight的节点。

扫描二维码关注公众号,回复: 2935767 查看本文章

一开始,我在判断时,以每个结点为根节点都计算了一遍度。。。

还有一个测试点超时了。

for(i=1;i<=n;i++){
        fill(visit,visit+10010,false);
        dfs(i,1);
    }

其实大可不必如此,想想我们在判断是否为连通图的时候,我们就已经得到了以0为根节点,最深的根节点们,想一想,如果我们以这些节点为根节点建树,得到的深度是不是也是最深。所以,只要再以第一遍存储下的节点进行DFS即可,是不是省了很多时间。

#include<iostream>
#include<vector>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
int n,maxheight=0;
bool visit[10010];
std::vector<vector<int>> graph;
std::vector<int> result;
set<int>node;
void dfs(int node, int height) {
    if(height > maxheight) {
        result.clear();
        result.push_back(node);
        maxheight = height;
    } else if(height == maxheight){
        result.push_back(node);
    }
    visit[node] = true;
    for(int i = 0; i < graph[node].size(); i++) {
        if(visit[graph[node][i]] == false)
            dfs(graph[node][i], height + 1);
    }
}
int numpart(){
    int num=0;
    for(int i=1;i<=n;i++){
        if(visit[i]==false){
            num++;
            dfs(i,1);
        }
    }
    return num;
}
int main(){
    scanf("%d",&n);
    graph.resize(n+1);
    for(int i=0;i<n-1;i++){
        int a,b;
        scanf("%d %d",&a,&b);
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    int sum=numpart();
    if(sum!=1){
        printf("Error: %d components",sum);
    }
    else{
        int r0=result[0];
        for(int i=0;i<result.size();i++)
            node.insert(result[i]);
	result.clear();
	maxheight=0;
	fill(visit,visit+10010,false);
	dfs(r0,1);
	for(int i=0;i<result.size();i++)
		node.insert(result[i]);
	for(auto it=node.begin();it!=node.end();it++)
	    printf("%d\n",*it);
    }
    system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_41562704/article/details/82026268