最小生成树Prim算法模板

题目地址:

http://poj.org/problem?id=1251

该题是个模板题,所以直接拿来做模板了。

该代码是AC代码。

代码:

#include 
#include
#include
#include
#include
#define MAX 27
//图的规模
#define INF 99999999
//定义无穷大
using namespace std;
int N;
//节点的数目N
//此外,在这里可能会有路径的数目M
int map[MAX][MAX];
//邻接表
int micost[MAX];
//到上一个点的最小路径
int vis[MAX];
//记录该点有没有加入最小生成树中
void Prim()
{
   int i,j,v,Min;
   int ans;
   //最小生成树的总权值
   //1是第一个加入该最小生成树的节点
   for(i=1;i<=N;i++)
   {
    micost[i]=map[1][i];
    vis[i]=0;
   }//初始化节点
   //定义每个节点的micost为1到其他点的距离
   micost[1]=0;
   vis[1]=1;
   //起点的上一个节点没有节点,所以为0
   //定义起点已经加入了最小生成树
   ans=0;
   //初始化最小生成树的权值为零
   //注意在循环里起点不包含进去
   //为了防止错误
   //因为不包含起点所以循环要从i=2开始
   for(i=2;i<=N;i++)
   {
    Min=INF;
    for(j=2;j<=N;j++)
    {
        if(!vis[j]&&Min>micost[j])
            v=j,Min=micost[j];
    }//找micost最小的节点并加入最小生成树
     vis[v]=1;
     if(Min!=INF)
     ans=ans+Min;
     for(j=2;j<=N;j++)
     {
        if(!vis[j]&&micost[j]>map[v][j])
            micost[j]=map[v][j];
     }//更新节点
   }
   cout<int main()
{
    int i,j,num,x,y,z;
    char a,b;
    while(cin>>N,N)//输入图的节点数,路径数,(一般情况下)
    {
      for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
      {
        if(i==j)map[i][j]=0;
        else
            map[i][j]=INF;
      }//初始化邻接表
        for(i=1;icin>>a>>num;
            for(j=1;j<=num;j++){
                cin>>b>>z;
                x=a-64;
                y=b-64;
                map[x][y]=map[y][x]=z;
            }
        }//输入图
        Prim();
    }
    return 0;
}

你可能感兴趣的:(最小生成树,模板)