習題8.4 暢通工程之最低成本建設問題 (30分)


某地區經過對城鎮交通狀況的調查,得到現有城鎮間快速道路的統計數據,並提出“暢通工程”的目標:使整個地區任何兩個城鎮間都可以實現快速交通(但不一定有直接的快速道路相連,只要互相間接通過快速路可達即可)。現得到城鎮道路統計表,表中列出了有可能建設成快速路的若干條道路的成本,求暢通工程需要的最低成本。

輸入格式:

輸入的第一行給出城鎮數目N (1)和候選道路數目M≤3N;隨后的M行,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號(從1編號到N)以及該道路改建的預算成本。

輸出格式:

輸出暢通工程需要的最低成本。如果輸入數據不足以保證暢通,則輸出“Impossible”。

輸入樣例1:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
 

輸出樣例1:

12
 

輸入樣例2:

5 4 1 2 1 2 3 2 3 1 3 4 5 4 
 

輸出樣例2:

Impossible

代碼:
#include <stdio.h>
#include <stdlib.h>

struct path {
    int a,b,c;
}p[3000];
int f[1001],n,m;
void init() {
    for(int i = 1;i <= n;i ++) f[i] = i;
}
int getf(int k) {
    if(f[k] == k) return f[k];
    return f[k] = getf(f[k]);
}
int cmp(const void *a,const void *b) {
    return ((struct path *)a) -> c - ((struct path *)b) -> c;
}
int main() {
    scanf("%d%d",&n,&m);
    init();
    for(int i = 0;i < m;i ++) {
        scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
    }
    qsort(p,m,sizeof(p[0]),cmp);
    int c = 0,ans = 0;
    for(int i = 0;i < m;i ++) {
        if(getf(p[i].a) != getf(p[i].b)) {
            ans += p[i].c;
            c ++;
            f[getf(p[i].a)] = getf(p[i].b);
        }
    }
    if(c < n - 1) printf("Impossible\n");
    else printf("%d\n",ans);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM