Problem C: Save your cats
より
- import java.util.*;
- import java.lang.*;
- import java.math.*;
- public class Main{
- Scanner sc=new Scanner(System.in);
- int n, m;
- int[] x, y;
- int INF=1>>28;
- int[] p;
- int[] rank;
- void run(){
- n=sc.nextInt();
- m=sc.nextInt();
- x=new int[n];
- y=new int[n];
- for(int i=0; i<n; i++){
- x[i]=sc.nextInt();
- y[i]=sc.nextInt();
- }
- double sumW=0.0;
- E[] es=new E[m];
- for(int i=0; i<m; i++){
- int p=sc.nextInt()-1;
- int q=sc.nextInt()-1;
- double w=Math.sqrt((x[q]-x[p])*(x[q]-x[p])+(y[q]-y[p])*(y[q]-y[p]));
- sumW+=w;
- es[i]=new E(p, q, w);
- }
- Arrays.sort(es, new Comparator<E>(){
- public int compare(E e1, E e2){
- return e1.w<e2.w?1:-1;
- }
- });
- p=new int[n];
- rank=new int[n];
- for(int i=0; i<n; i++)
- p[i]=i;
- double extW=0.0;
- for(E e : es){
- if(findSet(e.v)!=findSet(e.u)){
- extW+=e.w;
- union(e.v, e.u);
- }
- }
- println((sumW-extW)+"");
- }
- void union(int x, int y){
- x=findSet(x);
- y=findSet(y);
- if(rank[x]>rank[y]){
- p[y]=x;
- }else{
- p[x]=y;
- if(rank[x]==rank[y]){
- rank[y]++;
- }
- }
- }
- int findSet(int x){
- if(p[x]!=x)
- p[x]=findSet(p[x]);
- return p[x];
- }
- public static void main(String[] args){
- new Main().run();
- }
- void println(String s){
- System.out.println(s);
- }
- void print(String s){
- System.out.print(s);
- }
- class E{
- int v, u;
- double w;
- E(int v, int u, double w){
- this.v=v;
- this.u=u;
- this.w=w;
- }
- }
- }
ただし,実行時間3:00[s]超.
0 件のコメント:
コメントを投稿