■0072 Carden Lantern
ただの最小全域木.木を構成しながら,(コスト/100-1)を灯篭の数としてカウントアップしていく.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1%lt;%lt;28; double EPS=1e-9; int n, m; int[][] w; void run(){ sc.useDelimiter("[,]|(\\s)+"); for(; sc.hasNext();){ n=sc.nextInt(); if(n==0){ break; } m=sc.nextInt(); w=new int[n][n]; for(int i=0; i%lt;n; i++){ Arrays.fill(w[i], -1); } for(int i=0; i%lt;m; i++){ int a=sc.nextInt(); int b=sc.nextInt(); int c=sc.nextInt()/100; w[a][b]=w[b][a]=c; } solve(); } } // w[i][j]=w[j][i] // w[i][j]=-1 -> E(i, j) not exist void solve(){ init(); LinkedList%lt;E> list=new LinkedList%lt;E>(); for(int j=0; j%lt;n-1; j++) for(int i=j+1; i%lt;n; i++) if(w[j][i]!=-1) list.add(new E(j, i, w[j][i])); E[] es=list.toArray(new E[0]); Arrays.sort(es, new Comparator%lt;E>(){ @Override public int compare(E e1, E e2){ return e1.w-e2.w; } }); list.clear(); int ans=0; for(E e : es){ if(find(e.v1)!=find(e.v2)){ union(e.v1, e.v2); ans+=e.w-1; list.add(e); } } println(""+ans); } int[] p, rank; void init(){ p=new int[n]; rank=new int[n]; for(int i=0; i%lt;n; i++){ p[i]=i; rank[i]=0; } } int find(int x){ if(p[x]==x) return x; else return p[x]=find(p[x]); } void union(int x, int y){ x=find(x); y=find(y); if(rank[x]>rank[y]){ p[y]=x; }else{ p[x]=y; if(rank[x]==rank[y]) rank[y]++; } } class E{ int v1, v2, w; E(int v1, int v2, int w){ this.v1=v1; this.v2=v2; this.w=w; } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿