博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj 1875 畅通工程再续 Prim / kruscal
阅读量:4215 次
发布时间:2019-05-26

本文共 3722 字,大约阅读时间需要 12 分钟。

1、kruskal
import java.awt.Container;import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class Main {	ArrayList
list; int c; int[]x = new int[105]; int[]y = new int[105]; int []id; public static void main(String[] args) { new Main().run(); } public void run() { Scanner in = new Scanner(System.in); int t = in.nextInt(); while(t-- > 0) { c = in.nextInt(); id = new int[c+1]; for(int i = 0; i <= c; i++ ) id[i] = i; for(int i = 1;i <= c; i++ ) { x[i] = in.nextInt(); y[i] = in.nextInt(); } list = new ArrayList<>(); for(int i = 1; i <= c; i++ ) { for(int j = i+1; j<= c; j++ ) { double d = getDistance(i, j); if(d < 10 || d> 1000) continue; list.add(new Edge(i, j, d)); } } Collections.sort(list); double sum = kruskal(); int cnt = 0; for(int i = 1; i <= c; i++ ) { if(i == id[i]) cnt++; } if(cnt > 1) { System.out.println("oh!"); } else { System.out.printf("%.1f",sum*100); System.out.println(); } } } public double kruskal() { double sum = 0; for(int i = 0; i < list.size(); i++ ) { Edge e = list.get(i); int p = find(e.u); int q = find(e.v); if(p == q) continue; id[p] = q; sum += e.w; } return sum; } public int find(int p) { if(p == id[p]) return p; else return id[p] = find(id[p]); } public double getDistance(int i, int j) { return Math.sqrt(1.0*(x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j])); } }class Edge implements Comparable
{ int u, v; double w; public Edge(int u, int v, double w) { this.u = u; this.v = v; this.w = w; } public int compareTo(Edge o) { return w > o.w ? 1 : -1; }}

2、Prim

import java.util.ArrayList;	import java.util.LinkedList;	import java.util.PriorityQueue;	import java.util.Queue;	import java.util.Scanner;				public class Main {		ArrayList
[]adj; int[]x = new int[105]; int[]y = new int[105]; boolean[]marked; int t, c; double INF = 999999.0; double sum; Queue
pq; public static void main(String[] args) { new Main().run(); } public void run() { Scanner in = new Scanner(System.in); t= in.nextInt(); while(t-- > 0) { c = in.nextInt(); pq = new PriorityQueue(); marked = new boolean[c+1]; adj = new ArrayList[c+1]; for(int i = 1; i <= c; i++ ) { adj[i] = new ArrayList<>(); } for(int i = 1;i <= c; i++ ) { x[i] = in.nextInt(); y[i] = in.nextInt(); } for(int i = 1; i < c; i++ ) { for(int j = i+1; j <= c; j++ ) { double d = getDistance(i, j); if(d < 10 || d > 1000) { continue; } else { adj[i].add(new Edge(i, j, d)); adj[j].add(new Edge(j, i, d)); //cnt[i]++; 可以用数组标记与其他顶点连接情况 //cnt[j]++ 当其与所有顶点都不连通时候 就输出oh! //不满足 d < 10 || d > 1000视为不连通 } } } prim(); } } public void prim() { sum = 0; visit(1); //System.out.println("hello"); while(!pq.isEmpty()) { Edge e = pq.poll(); int end = e.end; if(marked[end]) continue; sum += e.w; if(!marked[end]) visit(end); }// System.out.println(sum); if(sum != 0) { System.out.printf("%.1f",sum*100); System.out.println(); } else { System.out.println("oh!"); } } public void visit(int v) { marked[v] = true; for(Edge e:adj[v]) { if(!marked[e.end]) { pq.offer(e); } } } public double getDistance(int i, int j) { return Math.sqrt(1.0*(x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j])); } } class Edge implements Comparable
{ int start, end; double w; public Edge(int start, int end, double w) { this.start = start; this.end = end; this.w = w; } public int compareTo(Edge o) { return w > o.w ? 1:-1; } }

转载地址:http://ilimi.baihongyu.com/

你可能感兴趣的文章
Web前端学习笔记——AngularJS入门
查看>>
Web前端学习笔记——AngularJS之过滤器、服务、路由
查看>>
Web前端学习笔记——AngularJS之TodoMVC案例
查看>>
Web前端学习笔记——AngularJS之豆瓣电影案例
查看>>
Web前端学习笔记——模块化开发
查看>>
Web前端学习笔记——VueJS基础
查看>>
Web前端学习笔记——VueJS之过滤器、生命周期、请求、动画
查看>>
Web前端学习笔记——VueJS之组件、路由
查看>>
Web前端学习笔记——HTML基础
查看>>
Web前端学习笔记——CSS基础、选择器
查看>>
Web前端学习笔记——Webpack
查看>>
Web前端学习笔记——CSS样式、外观、复合选择器
查看>>
Web前端学习笔记——CSS显示模式、特性、背景
查看>>
Web前端学习笔记——CSS盒子模型、浮动
查看>>
Web前端学习笔记——CSS版心和布局流程、清除浮动
查看>>
Web前端学习笔记——CSS之Photoshop切图
查看>>
Web前端学习笔记——CSS定位、高级技巧、文字溢出、精灵图、Web字体
查看>>
Web前端学习笔记——CSS京东案例、BFC
查看>>
Web前端学习笔记——HTML5新标签与特性
查看>>
Web前端学习笔记——CSS3 新增选择器
查看>>