題目1024:暢通工程 2007年浙江大學計算機及軟件工程研究生機試真題

題目描述:
    省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若干條道路的成本。現請你編寫程序,計算出全省暢通需要的最低成本。
輸入:
    測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 N、村莊數目M (N, M < =100 );隨後的 N 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。爲簡單起見,村莊從1到M編號。當N爲0時,全部輸入結束,相應的結果不要輸出。
輸出:
    對每個測試用例,在1行裏輸出全省暢通需要的最低成本。若統計數據不足以保證暢通,則輸出“?”。
樣例輸入:
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
樣例輸出:
3
?
AC代碼:
#include<stdio.h>
#include<algorithm>
using namespace std;

int p[101];

struct Road {
	int start;
	int end;
	int cost;
	bool operator < (const Road &b) const {
		return cost < b.cost;
	}
}roads[100];

int findRoot(int x) {
	if(p[x]==-1)
		return x;
	else {
		int tmp = findRoot(p[x]);
		p[x] = tmp;
		return tmp;
	}
}

int Kruscal(Road r[], int n, int m) {
	int a, b, j, t=0, sum=0;
	sort(r,r+n);
	for(j=0; j<n; j++) {
		a = findRoot(r[j].start);
		b = findRoot(r[j].end);
		if(a!=b) {
			p[b] = a;
			sum += r[j].cost;
			t++;
		}
	}
	if(t == m-1)
		return sum;
	else
		return -1;
}

int main() {
	//freopen("in.txt","r",stdin);
    int n, m;
	while(scanf("%d %d",&n,&m)!=EOF && n) {
		int i;
		for(i=1; i<=m; i++) {
			p[i] = -1;
		}
		for(i=0; i<n; i++) {
			scanf("%d %d %d",&roads[i].start,&roads[i].end,&roads[i].cost);
		}
		int minCost = Kruscal(roads,n,m);
		if(minCost >= 0)
			printf("%d\n",minCost);
		else
			printf("?\n");
	}

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章