pirm算法求最小生成树

来源:互联网 发布:windows find 精确匹配 编辑:程序博客网 时间:2024/06/04 19:18
#include<stdio.h>#include<string.h>#define MaxInt  0x3f3f3f3f#define N 110//创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问int map[N][N],low[N],visited[N];int n;int prim(){int i,j,pos,min,result=0;memset(visited,0,sizeof(visited));//从某点开始,分别标记和记录该点visited[1]=1;pos=1;//第一次给low数组赋值for(i=1;i<=n;i++)if(i!=pos)low[i]=map[pos][i];//再运行n-1次    for(i=1;i<n;i++)    {//找出最小权值并记录位置min=MaxInt;for(j=1;j<=n;j++)if(visited[j]==0&&min>low[j]){min=low[j];pos=j;}//最小权值累加result+=min;//标记该点visited[pos]=1;//更新权值for(j=1;j<=n;j++)if(visited[j]==0&&low[j]>map[pos][j])low[j]=map[pos][j]; }return result;}int main(){    int i,v,j,ans;    while(scanf("%d",&n)!=EOF)    {//所有权值初始化为最大        memset(map,MaxInt,sizeof(map));        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                scanf("%d",&v);                map[i][j]=map[i][j]=v;            }            ans=prim();            printf("%d\n",ans);    }    return 0;}

0 0