您的位置:首页 > 其它

hihocoder 1109 : 最小生成树三·堆优化的Prim算法

2017-07-23 15:37 239 查看
<
4000
div class="limit">
时间限制:10000ms
单点时限:1000ms
内存限制:256MB


描述

回到两个星期之前,在成功的使用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,表示为了使任意两座城市都可以通过所建造的道路互相到达至少需要的建造费用。

样例输入
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));
}
}


EmacsNormalVim
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: