最小生成树 ———prim算法 poj 1258

来源:互联网 发布:java 获取本地路径 编辑:程序博客网 时间:2024/06/12 19:21

prim算法:所有点组成了一个集合 (笔者称之为全集),先从全集中选出一个点pos放入一个集合(笔者称之为 结果集 ),用一个数组记录pos到剩下点的距离(即 结果集到剩余点的距离),选出最短距离所对应的另一个点 D 加入到结果集中 ,将pos 更新为 D,此时遍历图,若D到剩余点的距离小于low数组中对应的值 ,则更新low数组,再重复选取结果集到剩余点的最短距离 更新low数组,poj 1258  点击打开链接

代码如下:

#include<stdio.h>#include<string.h>int map[120][120],visit[120],low[1100];int n,ans;void prim(){    int pos,i,j;    pos=1;    visit[pos]=1;    for(i=1; i<=n; i++)//第一次对low数组赋值        if(i!=pos)            low[i]=map[pos][i];    for(i=1; i<n; i++)    {        int min=999999;        for(j=1; j<=n; j++)            if(visit[j]==0&&min>low[j])            {                min=low[j];                pos=j;            }            //printf("**%d\n",min);        ans+=min;        visit[pos]=1;        for(j=1; j<=n; j++)//更新low数组;            if(visit[j]==0&&map[pos][j]<low[j])                low[j]=map[pos][j];    }}int main(){    int i,j,tem;    while(scanf("%d",&n)!=EOF)    {        memset(map,9999999,sizeof(map));        memset(visit,0,sizeof(visit));        for(i=1; i<=n; i++)            for(j=1; j<=n; j++)            {                scanf("%d",&tem);                map[i][j]=map[j][i]=tem;            }        ans=0;        prim();        printf("%d\n",ans);    }    return 0;}


0 0