最小生成树之Prim算法(模板)

来源:互联网 发布:淘宝有图评价 编辑:程序博客网 时间:2024/05/17 00:51

转载请注明出处:http://blog.csdn.net/u012860063


直接上代码:

// POJ  1258

#include <stdio.h>#include <string.h>#define INF 0x3f3f3f3f#define MAXN 517//创建m二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问int m[MAXN][MAXN], low[MAXN], visited[MAXN];int n;int prim( ){    int i, j;    int pos, minn, result=0;    memset(visited,0,sizeof(visited));    visited[1] = 1;    pos = 1;          //从某点开始,分别标记和记录该点    for(i = 1; i <= n; i++)     //第一次给low数组赋值        if(i != pos)            low[i] = m[pos][i];        else            low[i] = 0;    for(i = 1; i < n; i++) //再运行n-1次    {        minn = INF;   //找出最小权值并记录位置        for(j=1; j<=n; j++)        {            if(visited[j]==0 && minn>low[j])            {                minn = low[j];                pos = j;            }        }        result += minn;   //最小权值累加        visited[pos] = 1;   //标记该点        for(j = 1; j <= n; j++)   //更新权值            if(visited[j]==0 && low[j]>m[pos][j])                low[j] = m[pos][j];    }    return result;}int main(){    int i,j,ans;    while(scanf("%d",&n)!=EOF)    {        memset(m,INF,sizeof(m));   //所有权值初始化为最大        for(i = 1; i <= n; i++)            for(j = 1; j <= n; j++)            {                scanf("%d",&m[i][j]);            }        ans=prim( );        printf("%d\n",ans);    }    return 0;}


1 1
原创粉丝点击