时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
5 29 1 2 674 2 3 249 3 4 672 4 5 933 1 2 788 3 4 147 2 4 504 3 4 38 1 3 65 3 5 6 1 5 865 1 3 590 1 4 682 2 4 227 2 4 636 1 4 312 1 3 143 2 5 158 2 3 516 3 5 102 1 5 605 1 4 99 4 5 224 2 4 198 3 5 894 1 5 845 3 4 7 2 4 14 1 4 185
样例输出
-
92
-
import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; import java.util.Scanner; public class Main { static class Edge implements Comparable<Edge>{ int from,to; int dis; public Edge(int from, int to, int dis) { this.from = from; this.to = to; this.dis = dis; } @Override public int compareTo(Edge o) { return this.dis-o.dis; } } public int prim(List<Edge>[] graph,int start){ boolean[] visited=new boolean[graph.length]; PriorityQueue<Edge> queue=new PriorityQueue<Edge>(); for(int i=0;i<graph[start].size();i++){ queue.add(graph[start].get(i)); } visited[start]=true; int re=0; while(!queue.isEmpty()){ Edge edge=queue.poll(); if(visited[edge.to]) continue; visited[edge.to]=true; re+=edge.dis; for(int i=0;i<graph[edge.to].size();i++){ int x=graph[edge.to].get(i).to; if(!visited[x]) queue.add(graph[edge.to].get(i)); } } return re; } public static void main(String[] args) { Main main=new Main(); Scanner scan=new Scanner(System.in); int num=scan.nextInt(); List<Edge>[] graph=new ArrayList[num]; for(int i=0;i<graph.length;i++) graph[i]=new ArrayList<Edge>(); int count=scan.nextInt(); for(int i=0;i<count;i++){ int x=scan.nextInt(); int y=scan.nextInt(); int dis=scan.nextInt(); graph[x-1].add(new Edge(x-1,y-1,dis)); graph[y-1].add(new Edge(y-1,x-1,dis)); } System.out.println(main.prim(graph,0)); } }
描述
回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢?
提示:没有无缘无故的优化!输入
每个测试点(输入文件)有且仅有一组测试数据。
在一组测试数据中:
第1行为2个整数N、M,表示小Hi拥有的城市数量和小Hi筛选出路线的条数。
接下来的M行,每行描述一条路线,其中第i行为3个整数N1_i, N2_i, V_i,分别表示这条路线的两个端点和在这条路线上建造道路的费用。
对于100%的数据,满足N<=10^5, M<=10^6,于任意i满足1<=N1_i, N2_i<=N, N1_i≠N2_i, 1<=V_i<=10^3.
对于100%的数据,满足一定存在一种方案,使得任意两座城市都可以互相到达。
输出
对于每组测试数据,输出1个整数Ans,表示为了使任意两座城市都可以通过所建造的道路互相到达至少需要的建造费用。