生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯-安慰奶牛(java)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
算法訓(xùn)練 安慰奶牛 ?
時(shí)間限制:1.0s ? 內(nèi)存限制:256.0MB
? ?
問(wèn)題描述
Farmer John變得非常懶,他不想再繼續(xù)維護(hù)供奶牛之間供通行的道路。道路被用來(lái)連接N個(gè)牧場(chǎng),牧場(chǎng)被連續(xù)地編號(hào)為1到N。每一個(gè)牧場(chǎng)都是一個(gè)奶牛的家。FJ計(jì)劃除去P條道路中盡可能多的道路,但是還要保持牧場(chǎng)之間 的連通性。你首先要決定那些道路是需要保留的N-1條道路。第j條雙向道路連接了牧場(chǎng)Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的時(shí)間。沒(méi)有兩個(gè)牧場(chǎng)是被一條以上的道路所連接。奶牛們非常傷心,因?yàn)樗齻兊慕煌ㄏ到y(tǒng)被削減了。你需要到每一個(gè)奶牛的住處去安慰她們。每次你到達(dá)第i個(gè)牧場(chǎng)的時(shí)候(即使你已經(jīng)到過(guò)),你必須花去Ci的時(shí)間和奶牛交談。你每個(gè)晚上都會(huì)在同一個(gè)牧場(chǎng)(這是供你選擇的)過(guò)夜,直到奶牛們都從悲傷中緩過(guò)神來(lái)。在早上 起來(lái)和晚上回去睡覺(jué)的時(shí)候,你都需要和在你睡覺(jué)的牧場(chǎng)的奶牛交談一次。這樣你才能完成你的 交談任務(wù)。假設(shè)Farmer John采納了你的建議,請(qǐng)計(jì)算出使所有奶牛都被安慰的最少時(shí)間。
輸入格式
第1行包含兩個(gè)整數(shù)N和P。
接下來(lái)N行,每行包含一個(gè)整數(shù)Ci。
接下來(lái)P行,每行包含三個(gè)整數(shù)Sj, Ej和Lj。
輸出格式 輸出一個(gè)整數(shù), 所需要的總時(shí)間(包含和在你所在的牧場(chǎng)的奶牛的兩次談話(huà)時(shí)間)。 樣例輸入 5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6 樣例輸出 176 數(shù)據(jù)規(guī)模與約定
5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。
package com.sihai.advance;
import java.util.Scanner;public class ALGO_6 {class edge {public int a;public int b;public int value;edge(int a, int b, int value) {this.a = a;this.b = b;this.value = value;}}public void edgeSort(edge[] A){if(A.length > 1) {edge[] leftA = getHalfEdge(A, 0);edge[] rightA = getHalfEdge(A, 1);edgeSort(leftA);edgeSort(rightA);mergeEdgeArray(A, leftA, rightA);}}public edge[] getHalfEdge(edge[] A, int judge) {edge[] half;if(judge == 0) {half = new edge[A.length / 2];for(int i = 0;i < A.length / 2;i++)half[i] = A[i];} else {half = new edge[A.length - A.length / 2];for(int i = 0;i < A.length - A.length / 2;i++)half[i] = A[A.length / 2 + i];}return half;}public void mergeEdgeArray(edge[] A, edge[] leftA, edge[] rightA) {int i = 0;int j = 0;int len = 0;while(i < leftA.length && j < rightA.length) {if(leftA[i].value < rightA[j].value) {A[len++] = leftA[i++];} else {A[len++] = rightA[j++];}}while(i < leftA.length) A[len++] = leftA[i++];while(j < rightA.length) A[len++] = rightA[j++];}//獲取節(jié)點(diǎn)a的根節(jié)點(diǎn)public int find(int[] id, int a) {int x, r, k;r = a;while(id[r] >= 0) r = id[r];k = a;while(k != r) {x = id[k];id[k] = r;k = x;}return r;}//合并a節(jié)點(diǎn)所在樹(shù)和b節(jié)點(diǎn)所在樹(shù)public void union(int[] id, int a, int b) {int ida = find(id, a);int idb = find(id, b);int num = id[ida] + id[idb];if(id[ida] < id[idb]) {id[idb] = ida;id[ida] = num;} else {id[ida] = idb;id[idb] = num;}}//獲取題意最終結(jié)果public void getMinSpanTree(edge[] A, int[] valueN) {int sum = 0;int[] id = new int[valueN.length];for(int i = 0;i < valueN.length;i++) id[i] = -1;edgeSort(A);int count = 0;for(int i = 0;i < A.length;i++) {int a = A[i].a;int b = A[i].b;int ida = find(id, a - 1);int idb = find(id, b - 1);if(ida != idb) {sum += A[i].value;count++;union(id, a - 1, b - 1);}if(count >= valueN.length - 1)break;}int minValueN = valueN[0];for(int i = 0;i < valueN.length;i++) {if(minValueN > valueN[i]) {minValueN = valueN[i];}}sum += minValueN;System.out.println(sum);}public static void main(String[] args){ALGO_6 test = new ALGO_6();Scanner in = new Scanner(System.in);int n = in.nextInt();int p = in.nextInt();if(n > 10000 || n < 5)return;if(p > 100000 || p < n - 1)return;int[] valueN = new int[n];for(int i = 0;i < n;i++)valueN[i] = in.nextInt();edge[] A = new edge[p];for(int i = 0;i < p;i++) {int a = in.nextInt();int b = in.nextInt();int value = in.nextInt() * 2 + valueN[a - 1] + valueN[b - 1];A[i] = test.new edge(a, b, value);}test.getMinSpanTree(A, valueN);}
}
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯-安慰奶牛(java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。