PAT1021

来源:互联网 发布:淘宝详情模板下载 编辑:程序博客网 时间:2024/06/02 05:20

这是一道常规的图论题,题目链接如下:

http://www.patest.cn/contests/pat-a-practise/1021

这道题的大概意思是,首先判断一个图是不是树,如果不是则输出联通分量的个数,否则找出使得改树高度最高的所有根节点并输出。
首先使用并查集可以非常轻易的判断出联通分量的个数
随后先任取一点遍历图,找到距离该点最远的点,然后,从找的的点中任取一点出发遍历找到的所有距离最远的点都是所求点,并且要注意第一次遍历图找到的点也包括在内。
同时需要注意的是,两次遍历中可能找到相同的点,因此我使用了set集合来解决这个问题,代码如下:

import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.Scanner;import java.util.TreeSet;public class Main {    static int N;    static HashMap<Integer, ArrayList<Integer>> map;    static int[] gen;    static TreeSet<Integer> as;    static int maxhigh;    public static void main(String[] args) {        Scanner sc=new Scanner(System.in);        N=sc.nextInt();        map=new HashMap<Integer, ArrayList<Integer>>();        gen=new int[N+1];        for(int i=1;i<=N;i++)            gen[i]=i;        for(int i=1;i<=N;i++){            map.put(i, new ArrayList<Integer>());        }        for(int i=1;i<=N-1;i++){            int x=sc.nextInt();            int y=sc.nextInt();            union(x,y);            map.get(x).add(y);            map.get(y).add(x);        }        int num=0;        for(int i=1;i<=N;i++){            if(gen[i]==i) num++;        }        if(num>1){            System.out.println("Error: "+num+" components");        }        else{            if(N==1) System.out.println(1);            else{            as=new TreeSet<Integer>();            as.addAll(longlef(1,1));            as.addAll(longlef(as.first(),1));            Iterator<Integer> it=as.iterator();            while(it.hasNext()){                System.out.println(it.next());            }        }    }    }    public static TreeSet<Integer> longlef(int x,int h){        TreeSet<Integer> ar=new TreeSet<Integer>();         int[] visited=new int[N+1];         for(int i=1;i<=N;i++){                visited[i]=0;            }         maxhigh=-1;          dfs(x,h,visited,ar);         return ar;    }    public static void dfs(int x,int h,int[] visited,        TreeSet<Integer> ar){         visited[x]=1;         if(h>maxhigh){             maxhigh=h;             ar.clear();             ar.add(x);         }         else if(h==maxhigh){             ar.add(x);         }         for(int i=0;i<map.get(x).size();i++){             if(visited[map.get(x).get(i)]==0)                 dfs(map.get(x).get(i),h+1,visited,ar);               }    }    public static int getgen(int x){        if(gen[x]==x) return x;        else return gen[x]=getgen(gen[x]);    }    public static void union(int x,int y){        int a=getgen(x);        int b=getgen(y);        if(a==b) return;        else {            gen[a]=b;        }    }}
0 0