PAT 1021 Deepest Root (求树的高度 图的连通块数)

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 (≤104) 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

思路

时间限制2s,很充足,足够每个节点试一次,而不用做什么优化。

再尝试前,记得判断下,联通块的个数。(不然这个25的就太容易过了

代码

#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
#include <stack>
#include <functional>
#include <limits.h> 
using namespace std;
int N;
vector<int> node[10000 + 10];
int mdeep = INT_MIN;
vector<int> droot;
bool visit[10000 + 10];
int getDeep(int index, int deep){
	//cout << index << endl;
	int mdeep = deep + 1;
	for(int i = 0; i < node[index].size(); i++){
		if(visit[node[index][i]] == false){
			visit[node[index][i]] = true;
			mdeep = max(mdeep, getDeep(node[index][i], deep + 1));
		}
	}
	return mdeep;
}

void dfs(int index){
	for(int i = 0; i < node[index].size(); i++){
		if(visit[node[index][i]] == false){
			visit[node[index][i]] = true;
			dfs(node[index][i]);
		}
	}
}

int getBlock(){
	int block = 0;
	for(int i = 1; i <= N; i++){
		if(visit[i] == false){
			visit[i] = true;
			dfs(i);
			block++; 
		}
	}
	return block;
}

int main() {
	cin >> N;
	int a, b;
	for(int i = 0; i < N - 1; i++){
		cin >> a >> b;
		node[a].push_back(b);
		node[b].push_back(a);
	}
	int block = getBlock();
	if(block != 1){
		cout << "Error: "<< block <<" components" << endl;
		return 0;
	}
	for(int i = 1; i <= N; i++){
		memset(visit, 0, sizeof(visit));
		visit[i] = true;
		int md = getDeep(i, 0);
		if(md > mdeep){
			droot.clear();
			droot.push_back(i);
			mdeep = md;
		}
		else if(md == mdeep){
			droot.push_back(i);
		}
	}
	sort(droot.begin(), droot.end());
	for(int i = 0; i < droot.size(); i++){
		cout << droot[i] << endl; 
	} 
	return 0; 
}
posted @ 2020-03-04 17:55  阳离子  阅读(114)  评论(0编辑  收藏  举报