08-图7 公路村村通(30 分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:
输入数据包括城镇数目正整数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
###思路:
题中给出边数M(≤3N),所以为稀疏图,故kruskal算法更好。以sort()函数+并查集实现。用sort函数排序,以并查集检查回路。

#include
#include
#include
#include
using namespace std;
const int N = 1010;
int unionSet[N];
int visited[N];
struct Road{
	int x;
	int y;
	int price;
}; 

bool isLinked(int n){
	int num=0;
	for(int i = 1; i <= n; i++){
		if(unionSet[i]<0)
			num++;
	}
	if(num==1)
		return true;
	else
		return false;
}
int findRoot(int a){
	while(unionSet[a]>=0){
		a=unionSet[a];
	}
	return a;
}
void setUnion(int a, int b){
	int rootA = findRoot(a);
	int rootB = findRoot(b);
	if(rootA==rootB)
		return;
	if(unionSet[rootA]>=unionSet[rootB]){
		unionSet[rootB]+=unionSet[rootA];
		unionSet[rootA]=rootB;
	}else{
		unionSet[rootA]+=unionSet[rootB];
		unionSet[rootB]=rootA;
	}
}
bool cmp(struct Road a, struct Road b){
	if(a.price <= b.price)
		return true;
	return false;
}
int main(){
	int n,m;
	int minPrice=0;
	cin>>n>>m;
	struct Road *road = new Road[m]; 
	for(int i = 1; i<= n;i++){//为检查连通性初始化
		unionSet[i]=-1;
		visited[i]=0;
	}
	for(int i = 0; i < m; i++){
		cin>>road[i].x>>road[i].y>>road[i].price;
		setUnion(road[i].x,road[i].y);
	}
	if(!isLinked(n)){//检查是否为连通图
		cout<<"-1"<<endl;
		return 0;
	}
	for(int i = 1; i<= n;i++){//为检查回路初始化
		unionSet[i]=-1;
		visited[i]=0;
	}
	sort(road,road+m,cmp);//按造价从小到大排序
	for(int i=0; i < m; i++){
		if(visited[road[i].x]==0||visited[road[i].y]==0){//如果新加入的边中有未访问过的点
			setUnion(road[i].x,road[i].y);
			minPrice += road[i].price;
			visited[road[i].x]=1;
			visited[road[i].y]=1;
		}else if(findRoot(road[i].x)!=findRoot(road[i].y)){//如果新加入的边上的两点都访问过了,则检查是否构成回路
			setUnion(road[i].x,road[i].y);
			minPrice += road[i].price;
		}
	}
	cout<<minPrice<<endl;
	return 0;
}

你可能感兴趣的:(数据结构(Data,Structure))