畅通工程再续_hdu 1875(并查集+最小生成树).java
2013-08-12 21:24
309 查看
畅通工程再续
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10811 Accepted Submission(s): 3286
Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
Sample Input
2
2
10 10
20 20
3
1 1
2 2
1000 1000
Sample Output
1414.2
oh!
Author
8600
Source
2008浙大研究生复试热身赛(2)——全真模拟
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main{ static Point f[],map[]; static int rand[],p[],n; public static void main(String[] args) { Scanner input=new Scanner(System.in); int N=input.nextInt(); while(N-->0){ n=input.nextInt(); f=new Point ; rand=new int ; p=new int ; map=new Point[6000]; Init(); for(int i=0;i<n;i++){ int a=input.nextInt(); int b=input.nextInt(); f[i]=new Point(a,b); } int e=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ double t=Math.sqrt(Math.pow(f[i].x-f[j].x, 2)+Math.pow(f[i].y-f[j].y, 2)); if(t>=10.0&&t<=1000.0){ map[e++]=new Point(i,j,t); } } } Arrays.sort(map,0,e,new Comparator<Point>(){ @Override public int compare(Point a0, Point a1) { if(a0.s<a1.s) return -1; else if(a0.s==a1.s) return 0; return 1; } }); // /* for(int i=0;i<e;i++) System.out.println(map[i].s+" "); */ // double sum=0; for(int i=0;i<e;i++){ if(heBing(map[i].x,map[i].y)){ sum+=map[i].s; } } int num=0; for(int i=0;i<n;i++){ if(p[i]==i) num++; } if(num==1) System.out.println(String.format("%.1f",sum*100)); else System.out.println("oh!"); } } private static boolean heBing(int x, int y) { int X=find(x); int Y=find(y); if(X==Y) return false; if(rand[X]<rand[Y]){ p[X]=Y; } else{ p[Y]=X; if(rand[X]==rand[Y]) rand[X]++; } return true; } private static int find(int x) { while(x!=p[x]) x=p[x]; return x; } private static void Init() {//初始化 Arrays.fill(rand, 1); for(int i=0;i<n;i++) p[i]=i; } } class Point{ int x,y; double s; Point(int x,int y){ this.x=x; this.y=y; } Point(int x,int y,double s){ this.x=x; this.y=y; this.s=s; } }
相关文章推荐
- 畅通工程_hdu_1863(并查集+最小生成树).java
- 【HDU 1875】畅通工程再续(最小生成树-水题)
- HDU 1875 畅通工程再续 最小生成树(简单题)
- hdu-1875-畅通工程再续-最小生成树
- 畅通工程 hdu 1232 && HDU - 1863 (并查集+最小生成树)
- HDU 1875 畅通工程再续(最小生成树-Kruskal)
- 文章标题 HDU 1875: 畅通工程再续(最小生成树)
- hdu1875——畅通工程再续(最小生成树)
- HDU--1875--畅通工程再续(最小生成树)
- hdu 1875 畅通工程再续 最小生成树
- Hdu 1875 畅通工程再续【最小生成树】
- hdu 1875 畅通工程再续(最小生成树)
- HDU 1875 畅通工程再续(最小生成树-Kruskal算法)
- 【解题报告】 HDU 1875 畅通工程再续 Kruskal最小生成树 一点关于浮点型在计算机中储存的分析
- hdu 1875 畅通工程再续 【最小生成树-prim】
- hdu 1875 畅通工程再续(最小生成树 kruskal)
- HDU 1875 畅通工程再续(水最小生成树)
- HDU - 1875 畅通工程再续(最小生成树)
- hdu 1875 畅通工程再续(图论:最小生成树)
- HDU 1875 畅通工程再续 最小生成树问题