POJ-1251-Jungle Roads(Prim算法-最小生成树-模板题目)
本代码模板抄录自kuangbin模板集
/*
Prim算法求最小生成树的权值
耗费邻接矩阵 cost[][],标号从 0 开始,0∼n-1
返回最小生成树的权值,返回 -1 表示原图不连通
*/
const int inf = 0x3f3f3f3f;
const int maxn = 110;
bool vis[maxn];
//编号为i的结点通过权值为lowc[i]的边连入了最小生成树
int lowc[maxn];
//(权值的邻接矩阵,结点总个数)
int Prim(int cost[][maxn],int n){
int ans = 0;
memset(vis,false,sizeof(vis));
vis[0] = true;
for(int i=1;i<n;i++){
lowc[i] = cost[0][i];
}
for(int i=1;i<n;i++){
int minc = inf;
int p = -1;
for(int j=0;j<n;j++){
if(!vis[j] && minc>lowc[j]){
minc = lowc[j];
p = j;
}
}
if(minc == inf)return -1;
ans += minc;
vis[p] = true;
for(int j=0;j<n;j++){
if(!vis[j] && lowc[j]>cost[p][j]){
lowc[j] = cost[p][j];
}
}
}
return ans;
}
下面是模板题目的解法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
/*
Prim 求最小生成树的权值
耗费矩阵 cost[][],标号从 0 开始,0∼n-1
返回最小生成树的权值,返回 -1 表示原图不连通
*/
const int inf = 0x3f3f3f3f;
const int maxn = 110;
bool vis[maxn];
//编号为i的结点通过权值为lowc[i]的边连入了最小生成树
int lowc[maxn];
//(权值的邻接矩阵,结点总个数)
int Prim(int cost[][maxn],int n){
int ans = 0;
memset(vis,false,sizeof(vis));
vis[0] = true;
for(int i=1;i<n;i++){
lowc[i] = cost[0][i];
}
for(int i=1;i<n;i++){
int minc = inf;
int p = -1;
for(int j=0;j<n;j++){
if(!vis[j] && minc>lowc[j]){
minc = lowc[j];
p = j;
}
}
if(minc == inf)return -1;
ans += minc;
vis[p] = true;
for(int j=0;j<n;j++){
if(!vis[j] && lowc[j]>cost[p][j]){
lowc[j] = cost[p][j];
}
}
}
return ans;
}
int cost[maxn][maxn];//权值的邻接矩阵
int n;//结点总个数
int readin(){
scanf("%d",&n);
if(n==0)return 0;
getchar();
for(int i=0;i<n;i++){
for(int k=0;k<n;k++){
cost[i][k] = inf;
}
}//完成初始化
for(int i=0;i<n-1;i++){
char ch;int len;
cin>>ch>>len;
//cout<<ch<<" "<<len<<endl;
while(len--){
char p;int v;
cin>>p>>v;
cost[ch-'A'][p-'A']=cost[p-'A'][ch-'A']=v;
}
getchar();
}
return 1;
}
int main(){
//freopen("in.txt","r",stdin);
while(readin()){
//cout<<"OK"<<endl;
cout<<Prim(cost,n)<<endl;
//
/*for(int i=0;i<n;i++){
cout<<i<<"=>"<<lowc[i]<<endl;
}*///可以通过输出lowc确定最小生成树的形态
break;
}
return 0;
}
给一个测试样例
9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
0
ans = 216
关于样例的图解释:
OK