PTA 數據結構與算法題目集(中文) 7-10 公路村村通 (30分) 最小生成樹(kruskal算法)


源代碼:https://github.com/yunwei37/myClassNotes
還有不少數據結構和算法相關的筆記以及pta題解哦x


克魯斯卡爾算法的基本思想是以邊爲主導地位,始終選擇當前可用的最小邊權的邊(可以直接快排或者algorithm的sort)。每次選擇邊權最小的邊鏈接兩個端點是kruskal的規則,並實時判斷兩個點之間有沒有間接聯通。

PTA題目

現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。

輸入格式:

輸入數據包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。爲簡單起見,城鎮從1到N編號。

輸出格式:

輸出村村通需要的最低成本。如果輸入數據不足以保證暢通,則輸出−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

輸出樣例:

12

//Kruskal算法 
#include<stdio.h>
#include<stdlib.h>

struct road{
	int v1;
	int v2;
	int cost;
} e[3004];//數組排序並選取最小值; 

int v[1001]={0};

int sort(const void *a,const void *b){
	return ((struct road*)a)->cost-((struct road*)b)->cost;
}

int root(int x){
	if(v[x]==0)	return x;
	else return v[x]=root(v[x]);
}

int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	int i;
	for(i=0;i<m;++i)
		scanf("%d %d %d",&e[i].v1,&e[i].v2,&e[i].cost);		
	qsort(e,m,sizeof(struct road),sort);
	int sum=0;
	//並查集 
	for(i=0;i<m;i++){
		if(root(e[i].v1)!=root(e[i].v2)){
			v[root(e[i].v2)]=root(e[i].v1);// 路徑壓縮 
			sum+=e[i].cost;
		}
	}
	int flag=1;
	for(i=1;i<=n;i++){
		if(v[i]==0&&flag) flag=0;
		else if(v[i]==0) break;
	}
	if(i<=n)	printf("-1");
	else
		printf("%d",sum);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章