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