安慰奶牛

来源:互联网 发布:周六日算法定节假日吗 编辑:程序博客网 时间:2024/05/02 01:31

 算法训练 安慰奶牛  
时间限制:1.0s   内存限制:256.0MB
      
问题描述

Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上 起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

输入格式

第1行包含两个整数N和P。

接下来N行,每行包含一个整数Ci

接下来P行,每行包含三个整数Sj, Ej和Lj

输出格式
输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。
样例输入
5 6
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
样例输出
178
数据规模与约定

5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。

import java.util.PriorityQueue;import java.util.Scanner;public class Main {static int[] s;static int[] a;static int n;static int m;static int ans = 1001;static Scanner in;static Edge edge;public Main() {// 构造函数初始化in = new Scanner(System.in);n=in.nextInt();m=in.nextInt();s = new int[n + 1];a = new int[n + 1];}public static int find(int x) {// 采用路径压缩的find()if (s[x] == -1)return x;elsereturn s[x] = find(s[x]);}public static void union(int root1, int root2) {// 按大小求并if (root1 > root2) {s[root2] = root1;} elses[root1] = root2;}public static void kruskal() {// 克鲁斯卡尔int edgesAccepted = 0;PriorityQueue<Edge> pq = new PriorityQueue<Edge>();for (int i = 1; i <= m; i++) {int u = in.nextInt(), v = in.nextInt(), w = in.nextInt();w = 2 * w + a[u] + a[v];edge = new Edge(u, v, w);pq.add(edge);}while(edgesAccepted<n-1){Edge edgeTemp=pq.poll();int x=find(edgeTemp.u);int y=find(edgeTemp.v);if(x!=y){ans+=edgeTemp.w;edgesAccepted++;union(x,y);}}}public static void main(String[] args) {new Main();for (int i = 1; i <= n; i++)s[i] = -1;for (int i = 1; i <= n; i++) {a[i] = in.nextInt();if (a[i] < ans)ans = a[i];}kruskal();System.out.println(ans);}public static class Edge implements Comparable<Edge> {// 自定义比较类private int u, v, w;public Edge(int u, int v, int w) {this.u = u;this.v = v;this.w = w;}public int compareTo(Edge o) {if (this.w > o.w)return 1;else if (this.w < o.w)return -1;elsereturn 0;}}}


1 0
原创粉丝点击