蓝桥练习08-Prim(最小生成树问题)

代码骑士
优质创作者: 游戏开发技术领域
2023-04-08 08:10:29

模板:

#include<bits/stdc++.h>
#define INF 100000005
using namespace std;
const int N=101;
float G[N][N];//邻接矩阵存储 
float Min[N];//蓝点最小边权 
bool B[N];//判断蓝白点 
float MST=0;//最小权值 

void Init(int n){//n-顶点个数 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			G[i][j]=INF;
		}
	}
	//辅助数组赋值从0到n 
	for(int i=0;i<=n;i++){
		Min[i]=INF;
		B[i]=true;
	}
} 

void InputG(int m){//m-边数 
	for(int k=1;k<=m;k++){
		int i,j,w;
		cin>>i>>j>>w;
		G[i][j]=G[j][i]=w;	
	}
}

void outputG(int n){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<G[i][j]<<'\t';
		}
		cout<<endl;
	}
}

void Prim(int n){
	for(int i=1;i<=n;i++){//遍历每个点
		int k=0;	
	//1、找边权最小的蓝点
		for(int j=1;j<=n;j++){
			if(B[j]&&Min[j]<Min[k]){
				k=j;
			}
		}
		B[k]=false;//洗白 
		MST+=Min[k];//加权 
	//2、根据中转点更新边权数组 
		for(int j=1;j<=n;j++){
			if(B[j]&&G[k][j]<Min[j]){
				Min[j]=G[k][j];
			}
		} 
	}
}

int main(){
	int n,m;
	cin>>n>>m;
	Init(n);//初始化 
	
	InputG(n);//赋值 
	outputG(n);
	//Prim
	Min[1]=0;//根结点为1
	Prim(n);
	
	cout<<MST;//输出最小边权 
	return 0;
} 

问题:

省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。已知村庄数N和可建道路数M,设初始状态下任意村庄之间没有路,请编写程序,根据输入的两村庄间修建道路的费用情况,计算这些村庄畅通所需要的最低成本。

输入格式:

测试数据有多组。每组测试数据第1行输入村庄数目N ( 1< N < 11 )和道路数M;随后的M行输入村庄间道路的成本,每行给3个正整数,分别是两个村庄的编号(从1编号到N),修建此两村庄间道路的成本(不超过50)。当输入0 0时,表示输入结束。

输出格式:

对于每组测试,输出这些村庄畅通所需要的最低成本。

输入样例:
3 3
1 2 1
1 3 2
2 3 4
0 0
输出样例:
3
出处:

HDOJ

 

#include<bits/stdc++.h>
#define INF 100000005
using namespace std;
const int N=101;
float G[N][N];//邻接矩阵存储 
float Min[N];//蓝点最小边权 
bool B[N];//判断蓝白点 
float MST=0;//最小权值 

void Init(int n){//n-顶点个数 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			G[i][j]=INF;
		}
	}
	//辅助数组赋值从0到n 
	for(int i=0;i<=n;i++){
		Min[i]=INF;
		B[i]=true;
	}
} 

void InputG(int m){//m-边数 
	for(int k=1;k<=m;k++){
		int i,j,w;
		cin>>i>>j>>w;
		G[i][j]=G[j][i]=w;	
	}
}

void outputG(int n){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<G[i][j]<<'\t';
		}
		cout<<endl;
	}
}

void Prim(int n){
	for(int i=1;i<=n;i++){//遍历每个点
		int k=0;	
	//1、找边权最小的蓝点
		for(int j=1;j<=n;j++){
			if(B[j]&&Min[j]<Min[k]){
				k=j;
			}
		}
		B[k]=false;//洗白 
		MST+=Min[k];//加权 
	//2、根据中转点更新边权数组 
		for(int j=1;j<=n;j++){
			if(B[j]&&G[k][j]<Min[j]){
				Min[j]=G[k][j];
			}
		} 
	}
}

int main(){
	int n,m;
	cin>>n>>m;
	Init(n);//初始化 
	
	InputG(n);//赋值 
	
	//Prim
	Min[1]=0;//根结点为1
	Prim(n);
	
	cout<<MST;//输出最小边权 
	return 0;
} 

输出:

 

 

...全文
241 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5

社区成员

发帖
与我相关
我的任务
社区描述
考研408:数据结构、计算机组成原理、操作系统、计算机网络
学习方法考研面试 其他
社区管理员
  • 代码骑士
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧