PAT A1021最深根(25分)

ここに画像の説明を挿入
私の考えは、DFSを2回使用することです。最初は、接続されたサブグラフの数を判別するために使用されます。複数ある場合は、ツリーを形成できないことを意味し、接続されたサブグラフの数を出力して、プログラムを終了します。
2番目のDFSは、グラフがツリーを形成すると決定されたときにルートであるときに各ノードの最大レイヤー数を記録し、最後にループして最大レイヤー数のノードを見つけます。

#include <cstdio>
#include <vector>

using namespace std;

struct Node{
    
    
	int v;
	int layer;
}node[10010];

int n;
bool vis[10010];
vector<int> adj[10010];
int rootlayer[10010] = {
    
    0};

void init(){
    
    
	for(int i=0; i<10010; i++){
    
    
		vis[i] = false;
		node[i].layer = 0;
	}
}

void DFS(int index){
    
    
	vis[index] = true;
	for(int i=0; i<adj[index].size(); i++){
    
    
		int temp = adj[index][i];
		if(!vis[temp])
			DFS(adj[index][i]);
	}
}

void DFS2(int index, int layer, int &maxlayer){
    
    
	node[index].layer = layer;
	if(layer > maxlayer){
    
    
		maxlayer = layer;
	}
	vis[index] = true;
	for(int i=0; i<adj[index].size(); i++){
    
    
		int temp = adj[index][i];
		if(!vis[temp])
			DFS2(temp, layer+1, maxlayer);
	}
}

int main(){
    
    
	scanf("%d", &n);
	for(int i=0; i<n-1; i++){
    
    
		int a, b;
		scanf("%d %d", &a, &b);
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	
	init();
	int num = 0;
	for(int i=1; i<=n; i++){
    
    
		if(!vis[i]){
    
    
			DFS(i);
			num++;
		}
	}
	if(num != 1){
    
    
		printf("Error: %d components", num);
		return 0;
	}
	
	int MAX = -1;
	for(int i=1; i<=n; i++){
    
    
		init();
		int maxlayer = 0;
		if(!vis[i]){
    
    
			DFS2(i, 1, maxlayer);
		}
		rootlayer[i] = maxlayer;
		if(maxlayer > MAX){
    
    
			MAX = maxlayer;
		}
	}
	
	for(int i=1; i<=n; i++){
    
    
		if(rootlayer[i] == MAX){
    
    
			printf("%d\n", i);
		}
	}
	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45964844/article/details/113742359