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
- PAT1021
- pat1021
- PAT1021
- PAT1021~~~
- PAT1021
- pat1021-1030
- PAT1021. Deepest Root (25)
- PAT1021 Deepest Root
- pat1021 Deepest Root
- PAT1021 个位数统计 (15)
- PAT1021个位数统计
- pat1021:个位数统计
- PAT1021个位数统计 (15)
- PAT1021. 个位数统计 (15)
- PAT1021.个位数统计
- PAT1021. 个位数统计
- PAT1021 BASIC:个位数统计 (15)
- [并查集&&BFS]PAT1021 Deepest Root
- shiro入门实战笔记(2)--helloworld
- iOS 初级数据持久化-沙盒机制
- 第二个servlet
- get${XXX}FragmentManager()的区别
- python_proxy
- PAT1021
- 杭电ACM----2017字符串统计
- 数据结构基础之推导遍历结果
- 刷题、OJ 各种A+b Problem、、
- 杭电ACM----2018母牛的故事
- K-D树
- 杭电ACM----2019 数列有序!
- 杭电ACM----2020 绝对值排序
- nyoj733圣诞派对