最小生成树prim算法

来源:互联网 发布:csgo淘宝买激活码 编辑:程序博客网 时间:2024/05/22 04:28
最小生成树概念:给你n个点,两两点之间相连,现在要你找到n-1个边使其每条边的权值最小。
就以poj1258为例解释
首先定义一个map[]数组用来存放农场与农场之间的权值,visited[]数组用来存放已经访问的农场,low[]数组用来存放与这个农场相连的所有农场中距离最近的距离。
直接上代码:
#include <stdio.h>#include <string.h>#define MaxInt 0x3f3f3f3f#define N 110int 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;//首先随便找一个农场作为起点;    for(i=1;i<=n;i++)        if(i!=pos) low[i]=map[pos][i];//给low数组赋值;    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;         }//找出最小的距离并用pos标记;    result+=min;//距离相加;    visited[pos]=1;//标记第pos个农场已经被访问;    for(j=1;j<=n;j++)        if(visited[j]==0&&low[j]>map[pos][j])            low[j]=map[pos][j];//更新low数组;    }    return result;}int main(){    int i,j,ans;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                scanf("%d",&map[i][j]);            }            ans=prim();            printf("%d\n",ans);    }    return 0;}
最小生成树原理:
用visit[]数组存放已经被访问的顶点,用low[]数组存放最短距离,只要是不断地更新visit数组和low数组当所有的点都被访问时就会得到最短距离,即最短路径。

1 0
原创粉丝点击