标签:prim memset poj1251 水题 std names 算法 证明 ring
//最近在跟着kuangbin大佬疯狂水题 (ORZ)
//Prime算法求最小生成树
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf (0x3f3f3f3f)
using namespace std;
const int maxn = 35;
int Grape[maxn][maxn],d[maxn];
bool vis[maxn];
int n;//节点个数
int pre[maxn];
int Prime()
{
memset(d,inf,sizeof(d));
memset(pre,-1,sizeof(pre));
d[0] = 0;
while(true)
{
int mincost = inf,u = -1;
for(int v=0;v!=n;++v)
{
if(!vis[v]&&d[v]<mincost)//d[v] < inf 则证明有边到达v
{
mincost = d[v];
u = v;
}
}
if(mincost==inf)
break;
vis[u] = true;//用 u 节点更新 相邻节点
for(int v=0;v!=n;++v)
{
if(Grape[u][v]!=-1&&!vis[v]&&Grape[u][v]<d[v])
{
d[v] = Grape[u][v];
pre[v] = u;
}
}
}
int sum = 0;
for(int v=0;v!=n;++v)
if(pre[v]!=-1)
sum += Grape[v][pre[v]];
return sum;
}
int main()
{
while(cin>>n&&n)
{
memset(Grape,-1,sizeof(Grape));// u ~ v -1表示 不存在边
memset(vis,false,sizeof(vis));
char u,v; int num,weight,sum = 0;//权值
for(int i=0;i!=n-1;++i)
{
cin>>u>>num;
while(num--)
{
cin>>v>>weight;
Grape[u-‘A‘][v-‘A‘] = Grape[v-‘A‘][u-‘A‘] = weight;
sum += weight;
}
}//建图
cout<<Prime()<<endl;
}
}
标签:prim memset poj1251 水题 std names 算法 证明 ring
原文地址:https://www.cnblogs.com/newstartCY/p/11600955.html