输入格式:
第一行输入结点数量T
后续T行每行输入边的起点from、终点next、权weigth
输出:
最小生成树的权值之和
import java.util.*;
public class Prim {
static final int MAX=(int)(1e4+10);
static int T;
static int start,end;
static ArrayList<LinkedList<Edge>> arrayList=new ArrayList<LinkedList<Edge>>(MAX);//领接表
public static void main(String[] args) {
init();
prim();
}
static void init(){
Scanner cin=new Scanner(System.in);
T=cin.nextInt();//结点数量/组数
//start=cin.nextInt();//起点
int from=0,to,weigth;
for(int i=0;i<MAX;i++){
LinkedList<Edge> temp=new LinkedList<>();
arrayList.add(temp);
}
for(int i=0;i<T;i++){
from=cin.nextInt();
to=cin.nextInt();
weigth=cin.nextInt();//权
arrayList.get(from).add(new Edge(from,to,weigth));//领接表
arrayList.get(to).add(new Edge(to,from,weigth));//领接表
}
start=from;
}
static void prim(){
int sum=0;
boolean[] isfind =new boolean[MAX];
PriorityQueue<Node> priorityQueue=new PriorityQueue<Node>(new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o1.dis-o2.dis;
}
});
priorityQueue.add(new Node(start,0));
while(!priorityQueue.isEmpty()){
Node node=priorityQueue.poll();
if(isfind[node.num])
continue;
isfind[node.num]=true;
sum+=node.dis;
for(Edge edge:arrayList.get(node.num)){
if(isfind[edge.next])
continue;
priorityQueue.add(new Node(edge.next,edge.weigth));
}
}
System.out.println(sum);
}
}
class Node{
int num;
int dis;
Node(int num,int dis){
this.num=num;
this.dis=dis;
}
}
class Edge{
public int from;
public int next;
public int weigth;
Edge(int from,int next,int weigth){
this.from=from;
this.next=next;
this.weigth=weigth;
}
}