1. 程式人生 > >牛客網——繼續暢通工程

牛客網——繼續暢通工程

以及 是否 ++ .com www args 繼續暢通工程 compare ring

題目描述

省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。現得到城鎮道路統計表,表中列出了任意兩城鎮間修建道路的費用,以及該道路是否已經修通的狀態。現請你編寫程序,計算出全省暢通需要的最低成本。

輸入描述:

    測試輸入包含若幹測試用例。每個測試用例的第1行給出村莊數目N ( 1< N < 100 );隨後的 N(N-1)/2 行對應村莊間道路的成本及修建狀態,每行給4個正整數,分別是兩個村莊的編號(從1編號到N),此兩村莊間道路的成本,以及修建狀態:1表示已建,0表示未建。

    當N為0時輸入結束。

輸出描述:

    每個測試用例的輸出占一行,輸出全省暢通需要的最低成本。

鏈接:https://www.nowcoder.com/questionTerminal/16212f7d46e44174b5505997ea998538
來源:牛客網

import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
 
class edge{
    private int u;
    private int v;
    private int w;
     
    public edge(int u, int
v, int w) { this.u = u; this.v = v; this.w = w; } public int getU() { return u; } public int getV() { return v; } public int getW() { return w; } public void setW(int w){ this.w = w; } } public class Main {
static int f[] = new int[100]; public static void main(String[] args) { Scanner input=new Scanner(System.in); int n = input.nextInt(); //頂點數 int m = n*(n-1)/2; //邊數 edge e[] = new edge[m]; for(int i=0;i<m;i++){ int u = input.nextInt(); int v = input.nextInt(); int w = input.nextInt(); e[i] = new edge(u,v,w); int status = input.nextInt(); if(status == 1){ e[i].setW(0); } } //按邊的權值從小到大排序 Arrays.sort(e, new Comparator<edge>(){ public int compare(edge o1, edge o2) { if(o1.getW()>o2.getW()){ return 1; }else if(o1.getW()<o2.getW()){ return -1; }else{ return 0; } } }); //並查集初始化,數組裏存的是自己數組的下標編號 for(int i=0;i<n;i++){ f[i] = i; } //Kruskal算法核心部分 int count = 0,sum = 0; for(int i=0;i<m;i++){ //從小到大枚舉每一條邊 if(merge(e[i].getU(),e[i].getV())){ //判斷兩個點是否聯通,不連通則用這條邊 count++; sum += e[i].getW(); } if(count == n-1){ break; } } System.out.println(sum); } //並查集合並兩個子集合 public static boolean merge(int u,int v){ int t1 = getf(u); int t2 = getf(v); if(t1 != t2){ //判斷兩個點是否在同一個集合中 f[t2] = t1; return true; } return false; } //並查集尋找祖先 public static int getf(int v){ if(f[v]==v){ return v; }else{ f[v] = getf(f[v]); //路徑壓縮 return f[v]; } } }

牛客網——繼續暢通工程