CCF CSP 最优灌溉 JAVA 201412_4 100分

时间:2021-04-22 21:30:21

用的并查集和优先队列去解的。

最小生成树问题。

package csp2014_12_4;

import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

class Edge implements Comparable<Edge>{
	int s,e,cost;
	Edge(int a,int b,int c){
		s=a;e=b;cost=c;
	}
	public Edge() {}
	@Override
	public int compareTo(Edge o) {
		if(this.cost-o.cost==0) 	return this.s-o.s;
		return this.cost-o.cost;
	}
}

public class Main{
	static Queue<Edge> q = new PriorityQueue<Edge>();

	static int pre[];
	static int find(int x){
		if(pre[x]==x) return x;
		else return pre[x] = find(pre[x]);
	}
	static void link(int x,int y){
		int xx = find(x);
		int yy = find(y);
		if(xx>yy) pre[xx] = yy;
		else pre[yy] = pre[xx];
	}
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		for (int i = 0; i < m; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			int c = sc.nextInt();
			q.add(new Edge(a,b,c));
		}
		
		pre = new int[n+1];
		for (int i = 0; i < pre.length; i++) {
			pre[i] = i;
		}
		
		int ans = 0;
		Edge temp = new Edge();
		while(!q.isEmpty()){
			temp = q.poll();
			int x = temp.s;
			int y = temp.e;
			if(find(x)==find(y))	continue;
			link(x,y);
			ans += temp.cost;
		}
		System.out.println(ans);
	}
}


问题描述
试题编号: 201412-4
试题名称: 最优灌溉
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。
  为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉。
  现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用(注意不是所有麦田之间都可以建立水渠)。请问灌溉所有麦田最少需要多少费用来修建水渠。
输入格式
  输入的第一行包含两个正整数n, m,分别表示麦田的片数和雷雷可以建立的水渠的数量。麦田使用1, 2, 3, ……依次标号。
  接下来m行,每行包含三个整数a i, b i, c i,表示第a i片麦田与第b i片麦田之间可以建立一条水渠,所需要的费用为c i
输出格式
  输出一行,包含一个整数,表示灌溉所有麦田所需要的最小费用。
样例输入
4 4
1 2 1
2 3 4
2 4 2
3 4 3
样例输出
6
样例说明
  建立以下三条水渠:麦田1与麦田2、麦田2与麦田4、麦田4与麦田3。
评测用例规模与约定
  前20%的评测用例满足:n≤5。
  前40%的评测用例满足:n≤20。
  前60%的评测用例满足:n≤100。
  所有评测用例都满足:1≤n≤1000,1≤m≤100,000,1≤c i≤10,000。