程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu_1863 暢通工程

hdu_1863 暢通工程

編輯:C++入門知識

TimeLimit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8916 Accepted Submission(s): 3454

ProblemDescription
省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若干條道路的成本。現請你編寫程序,計算出全省暢通需要的最低成本。
 
Input
測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 N、村莊數目M (< 100 );隨後的 N
行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。為簡單起見,村莊從1到M編號。當N為0時,全部輸入結束,相應的結果不要輸出。
 
Output
對每個測試用例,在1行裡輸出全省暢通需要的最低成本。若統計數據不足以保證暢通,則輸出“?”。
 
SampleInput
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
 
SampleOutput
3
?
解題思路:
這一題是一個典型的並查集案例題,這一題主要的解題思路是用剛學的並查集的示例代碼來實現的。用一個findSet(int x)函數來查找x節點的根節點,返回該跟節點的下標
用一個結構體array來表示某個節點的值,值x城市到y城市之間的距離為z,輸入的時候,先將輸入的路線按照城市與城市之間的距離z進行排序,連接的時候將結構體array數組的值作為該下標的父節點,這樣進行遞歸查找,當路線的條數等於城市數-1是就輸出,如果到最後建立起來的數的路線總數小於路線的條數等於城市數-1,也表示不可達
代碼實現:
#include <stdio.h> 
#include<iostream> 
#include <algorithm> 
using namespace std; 
int set[102];//每個節點,現在是一顆只有一個節點的樹 
struct array { 
    int x; 
    int y; 
    int z; 
}; 
int findSet(int x) {//查找x節點的根節點 
    if (x == set[x]) {//返回該下標 
        return x; 
    } else { 
        return set[x] = findSet(set[x]); 
    } 

int main() { 
    int n, m; 
    int count = 0;//計算總路線數量,n個節點n-1條邊 
    int sum = 0;//總價 
    int i,j; 
    array a[100]; 
    array temp; 
    //array a[100]; 
    while (scanf("%d", &n)) { 
        if (n != 0) {//輸入不為0時 
            sum = 0; 
            count = 0; 
            scanf("%d", &m); 
            for (i = 1; i <= n; i++) { 
                set[i] = i; 
                scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z); //第一個村莊a[i].x與第二個村莊a[i].y之間的距離a[i].z 
            } 
            for (i = 1; i <= n; i++) { 
                for (j = i + 1; j <= n; j++) {//從小到大排序 
                    if (a[i].z > a[j].z) { 
                        temp = a[i]; 
                        a[i] = a[j]; 
                        a[j] = temp; 
                    } 
                } 
            } 
            for (i = 1; i <= n; i++) { 
                int fx = findSet(a[i].x); 
                int fy = findSet(a[i].y); 
                if (fx==fy) {//有相同的父節點,則不用在連接了 
                    continue; 
                } else {//連接兩個節點 
                    set[fx] = fy ; 
                    count++;//路線總數 
                    sum += a[i].z; 
                } 
                if (count == m - 1) { 
                    break; 
                } 
            } 
            if(count<m-1) 
            {//輸出不符合情況 
                printf("?\n"); 
            } 
            else//輸出總和 
                printf("%d\n", sum); 
        } else { 
            break; 
        } 
    } 
    return 0; 


作者:CSDN515

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved