题目描述
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起。
现在小杉要把一些云朵连在一起,做成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入
每组测试数据的
第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10)
接下来M个数每行三个数X,Y,L,表示X云和Y云可以通过L的代价连在一起。(1<=X,Y<=N,0<=L<10000)
30%的数据N<=100,M<=1000
输出
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出K个棉花糖,请输出’No Answer’。
样例输入
3 1 2
1 2 1
样例输出
1
方法:kruskal算法+并查集
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
static int n,m,k;
static Edge[] edge=new Edge[1000000+10];
static int[] s;
static Scanner cin=new Scanner(System.in);
public static void main(String[] args) {
while(cin.hasNext()){
init();
kruskal();
}
}
static void init(){
n=cin.nextInt();
m=cin.nextInt();
k=n-cin.nextInt();
s=new int[n+1];
for(int i=1;i<s.length;i++)
s[i]=i;
for(int i=0;i<m;){
int a=cin.nextInt();
int b=cin.nextInt();
int c=cin.nextInt();
if(a==b){
m--;
continue;
}
edge[i]=new Edge(a, b, c);
i++;
}
Arrays.sort(edge, 0,m,new Comparator<Edge>() {
@Override
public int compare(Edge o1, Edge o2) {
return o1.weigth-o2.weigth;
}
});
}
static int find(int x){
return s[x]==x?x:find(s[x]);
}
static void kruskal(){
int ans=0;
if(k==0){
System.out.println(ans);
return;
}
for(int i=0;i<m;i++){
int a=find(edge[i].from);
int b=find(edge[i].next);
if(a==b)
continue;
s[b]=a;
ans+=edge[i].weigth;
--k;
if(k==0){
System.out.println(ans);
return;
}
}
System.out.println("No Answer");
}
}
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;
}
}