PAT1021
2016-02-06 17:56
441 查看
这是一道常规的图论题,题目链接如下:
http://www.patest.cn/contests/pat-a-practise/1021
这道题的大概意思是,首先判断一个图是不是树,如果不是则输出联通分量的个数,否则找出使得改树高度最高的所有根节点并输出。
首先使用并查集可以非常轻易的判断出联通分量的个数
随后先任取一点遍历图,找到距离该点最远的点,然后,从找的的点中任取一点出发遍历找到的所有距离最远的点都是所求点,并且要注意第一次遍历图找到的点也包括在内。
同时需要注意的是,两次遍历中可能找到相同的点,因此我使用了set集合来解决这个问题,代码如下:
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; } } }
相关文章推荐
- libdvbpsi源码分析(四)PAT表解析/重建
- PAT配置
- 什么是端口复用动态地址转换(PAT) 介绍配置实例
- MikroTik layer7-protocol
- PAT是如何工作的
- PAT 乙级题:1002. 写出这个数 (20)
- PAT (Advanced Level) Practise 1001-1010
- 数据结构学习与实验指导(一)
- PAT Basic Level 1001-1010解题报告
- 1001. 害死人不偿命的(3n+1)猜想
- 1002. 写出这个数
- 1032. 挖掘机技术哪家强
- 1001. 害死人不偿命的(3n+1)猜想 (PAT basic)
- 1002. 写出这个数(PAT Basic)
- 1004. 成绩排名(PAT Basic)
- 1006. 换个格式输出整数(PAT Basic)
- 1007. 素数对猜想(PAT Basic)
- 1008. 数组元素循环右移问题
- 1009. 说反话(PAT Basic)
- 1011. A+B和C(PAT Basic)