5
社区成员
发帖
与我相关
我的任务
分享模板:
#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;
}
输出:
