zoukankan      html  css  js  c++  java
  • 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; 
    }
    
  • 相关阅读:
    刚开发的游戏《天黑请闭眼》
    用手机控制服务器
    专业网站打包/解包asp工具(E文精装版本)!
    令我爱慕的女子(转自7di.net)
    8088 汇编速查手册
    Asp调用函数是否会影响性能?
    文档管理器
    ubuntu install xxx.deb
    Java线程池的原理及几类线程池的介绍
    ubuntu download file path
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12410997.html
Copyright © 2011-2022 走看看