畅通工程
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14333 Accepted Submission(s): 5931
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
import java.io.*;
import java.util.*;
public class hdu1863畅通工程_Kruskal算法 {
private static int find(int r) {
while(r!=fa[r])
r = fa[r];
return r;
}
static int fa[];
static int n,m,a,b,c;
static MAP[] map;
public static void main(String[] args) {
Scanner sc = new Scanner(new InputStreamReader(System.in));
while(true){
n = sc.nextInt();//道路条数
m = sc.nextInt();//村庄数目
if(n==0)break;
fa = new int[m+1];
map = new MAP[n+1];
for(int i=1;i<=m;i++)fa[i]=i;
for(int i=1;i<=n;i++){
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
map[i] = new MAP(a,b,c);
}
Arrays.sort(map,1, n+1);//排序
int Count=0;
long sum = 0;
for(int i=1; i<=n; i++){
int x = find(map[i].pre);//查找或合并边集
int y = find(map[i].to);
if(x!=y){//不在一个集合,而且为最小即可加入
fa[y] = x;
Count++;
sum += map[i].spend;
}
}
if(Count==m-1)
System.out.println(sum);
else
System.out.println("?");
}
}
}
class MAP implements Comparable<MAP>{
int pre,to,spend;
public MAP(int pre,int to,int spend){
this.pre = pre;
this.to = to;
this.spend = spend;
}
@Override
public int compareTo(MAP o) {
return this.spend - o.spend;//这个平时还真没咋的用。了解了!(注意Comparable与Comparator的区别)
}
}