现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数 n(≤1000)和候选道路数目 m(≤3n);随后的 m 行对应 m 条道路,每行给出 3 个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从 1 到 n 编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出 −1,表示需要建设更多公路。
输入样例:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
输出样例:
12
Java实现,使用了克鲁斯卡尔算法
import java.util.Scanner;
import java.util.Arrays;
public class Main {
final int Error=-1;
final int Max=100010;
int []parent;
int n,m;
Edge[]edges;
public Main(){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
parent=new int[n+1];
edges=new Edge[m];
for(int i=0;i<m;i++){
edges[i]=new Edge();
edges[i].start=sc.nextInt();
edges[i].end=sc.nextInt();
edges[i].weight=sc.nextInt();
}
int ans = Kruskal();
System.out.println(ans);
}
public int Find(int v){
while(parent[v]!=v){
v=parent[v];
}
return v;
}
public int Kruskal(){
int ans=0;
int count=0;
for(int i=0;i<parent.length;i++){
parent[i]=i;
}
Arrays.sort(edges,(o1,o2)->o1.weight-o2.weight);
for(int i=0;i<edges.length;i++){
int a=Find(edges[i].start);
int b=Find(edges[i].end);
if(a!=b){
parent[a]=b;
ans=ans+edges[i].weight;
count++;
}
}
if(count<n-1){
return -1;
}
return ans;
}
public static void main(String[]args){
Main Solution = new Main();
}
}
class Edge{
int start,end,weight;
public Edge(int start,int end,int weight){
this.start=start;
this.end=end;
this.weight=weight;
}
public Edge(){}
}
不懂的私信我
726






