zoukankan      html  css  js  c++  java
  • 1021. Deepest Root (25)

    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


    题目大意:如果是连通图,则求连通图中点Vi到点Vj所有路径中最长(包含多对)的并打印出所有Vi与Vj。如果是非连通图,则打印出有几个子图。用并查集判断是否是连通图,随后用搜索来求最长路。

    #include<iostream>
    #include<stdio.h>
    #include<vector>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define max 10002
    int visit[max];
    int a[max];
    int N;
    int distan[max];
    vector<int>map[max];
    int find(int x){
    	if(a[x]== x)return x;
    	find(a[x]);
    }
    void unio(int x,int y){
    	x = find(x);
    	y = find(y);
    	if(x != y){
    		a[x] = y;
    	}
    }
    int DFS(int key){
    	if(visit[key]==1)return 0;
    	visit[key]=1;
    	int i;
    	int sum = 0;
    	int m = map[key].size();
    	for(i=0;i<m;i++){
    		if(visit[map[key][i]]==0){
    			int tmp = DFS(map[key][i]);
    			if(sum < tmp){
    				sum = tmp;
    			}
    		}
    	}
    	return sum+1;
    }
    int main(){
    	scanf("%d",&N);
    	int i,j,t;
    	int s,d;
    	for(i=1;i<=N;i++){
    		a[i]=i;
    	}
    	for(i=1;i<N;i++){
    		scanf("%d%d",&s,&d);
    		unio(s,d);
    		map[s].push_back(d);
    		map[d].push_back(s);
    	}
    	int flag=0;
    	for(i=1;i<=N;i++){
    		if(a[i]==i){
    			flag++;
    		}
    	}
    	if(flag>1){
    		printf("Error: %d components",flag);
    	} else{
    		for(i=1;i<=N;i++){
    			memset(visit,0,sizeof(visit));
    			distan[i]=DFS(i);
    		}
    		int a=-1,b=0;
    		for(i=1;i<=N;i++){
    			if(distan[i]>a){
    				a=distan[i];
    				b=i;
    			}
    		}
    		for(i=1;i<=N;i++){
    			if(distan[i] == distan[b]){
    				printf("%d
    ",i);
    			}
    		}
    	}
    	return 0;
    }
    

      




  • 相关阅读:
    java解析xml的几种方式
    Android Studio 问题解决List
    Android 无线调试方法
    Android 单选/复选控件
    clr
    jquery.metadata.js使用分析
    更改新建Asp.net WebForm的模板 的方法
    获取定位数据
    简易水平仪实现
    简易指南针实现
  • 原文地址:https://www.cnblogs.com/grglym/p/7649467.html
Copyright © 2011-2022 走看看