java P1195 口袋的天空

题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。

有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

题目描述
给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起。

现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。

输入格式
每组测试数据的

第一行有三个数N,M,K(1≤N≤1000,1≤M≤10000,1≤K≤10)

接下来M行每行三个数X,Y,LX,Y,L,表示XX云和YY云可以通过LL的代价连在一起。(1 \le X,Y \le N,0 \le L<10000)(1≤X,Y≤N,0≤L<10000)

330%的数据N≤100,M≤1000

输出格式
对每组数据输出一行,仅有一个整数,表示最小的代价。

如果怎么连都连不出K个棉花糖,请输出’No Answer’。

输入输出样例
输入 #1

3 1 2
1 2 1

输出 #1

1

说明/提示
厦门一中YMS原创

package a44;

import java.util.*;

public class Main {

	public static void main(String[] args) {
		new Main().na();
	}

	int n = 0, m = 0, t1 = 0;
	int t2 = 0, t3 = 0, k = 0;
	int[] a = new int[10010];

	public void na() {
		Scanner in = new Scanner(System.in);

		List<Node> nodes = new ArrayList<Node>();
		n = in.nextInt();
		m = in.nextInt();
		k = in.nextInt();

		for (int i = 1; i <= n; i++) {
			a[i] = i;
		}

		for (int i = 1; i <= m; i++) {
			nodes.add(new Node(in.nextInt(), in.nextInt(), in.nextInt()));
		}
		Collections.sort(nodes);
		int cnt = 0, sum = 0;
		for (int i = 0; i < m; i++) {

			if (find(nodes.get(i).s) != find(nodes.get(i).e)) {
				a[find(nodes.get(i).s)] = find(nodes.get(i).e);
				sum += nodes.get(i).w;
				cnt++;
				System.out.println(sum + " "+ cnt);
			}
			if (cnt >= n - k) {
				break;
			}
		}
		if (cnt >= n - k) {
			System.out.println(sum);
		} else {
			System.out.println("No Answer");
		}
	}

	public int find(int x) {
	//  压缩路径
		if (a[x] == x) {
			return x;
		} else {
			return a[x] = find(a[x]);
		}

		/*
		 * int xx = x; while (xx != a[xx]) { xx = a[xx]; } int i; while (a[x] != x) { i
		 * = x; x = a[x]; a[i] = xx; } return xx;
		 */

	}

}

class Node implements Comparable<Node> {
	int s = 0;
	int e = 0;
	int w = 0;

	public Node(int s, int e, int w) {
		super();
		this.s = s;
		this.e = e;
		this.w = w;
	}

	@Override
	public int compareTo(Node o) { //   从小到大排序
		// TODO Auto-generated method stub
		return w - o.w;
	}
}

有一句话说的是 如果n个点被n-1条边连接的话,这一定是棵树。

那么:

连的边数 得到的树的个数

n-1 1

n-2 2

n-3 3

… …

n-k k

所以我们如果想要连出k棵树,就需要连n-k条边。

题目要求用n朵云连出k个棉花糖。

因为每个棉花糖都是连通的,

那么每个棉花糖就相当于是一棵树。

就是说要用n个节点连出k棵树。

也就是说要用n-k条边连出k棵树。

也就是说要花费连出n-k条边的代价。

既然一定要花费连出n-k条边的代价,

那么当然要选择代价最小的边连起来。

所以给每条可以连的边按代价从小到大排个序,

然后连n-k条边造k个最小生成树就可以了。

如果给的关系数m小于需要连的边数(n-k),是一定连不出k个树来的,因为m个关系只能连m条边。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值