您的位置:首页 > 其它

最小生成树-prim

2014-09-04 11:21 274 查看
算法模型: 由任意一个顶点开始 ,将此顶点存入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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: