首页 > 代码库 > 最小生成树-prim
最小生成树-prim
算法模型: 由任意一个顶点开始 ,将此顶点存入S集, 剩余顶点存入T集合
每次遍历顶点, 取一条能够连接S与T最短边e, 直到所有顶点全部加入S
#include<cstdio>
#include<cstring>#define INF 1<<30
int n,m,vis[110],low[110];
int map[110][110];
int init()
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
map[i][j] = INF;
memset(vis,0,sizeof(vis));
}
int prim()
{
int ans=0;
for(int i = 0; i <= n; i++)
low[i] = map[1][i]; //每个顶点与s集的最短距离,默认从1点开始
vis[1] = 1;
for(int i = 1; i < n; i++)
{
int temp = INF,pos=-1;
for(int j = 1; j <= n; j++)
if(temp>low[j]&&!vis[j]) //寻找最小边
{
pos = j;
temp = low[j];
}
if(pos==-1) return -1; // 代表这当前步骤缺少条件
int k = pos;
vis[k] = 1;
ans+=low[k];
for(int j = 1; j <= n; j++)
if(!vis[j]&&low[j]>map[k][j])//更新最小边
low[j] = map[k][j];
}
return ans;
}
int main()
{
int a,b,c;
while(scanf("%d%d",&m,&n)==2)
{
if(!m) break;
init();
for(int i = 0; i < m; i++)
{
scanf("%d %d %d",&a,&b,&c);
map[a][b] = map[b][a] = c;
}
int p = prim();
if(p==-1)
puts("?");
else
printf("%d\n",p);
}
return 0;
}
最小生成树-prim
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。