PKU 1251 1258 2485 最小生成树PRIME

PKU 1251 1258 2485 最小生成树PRIME

算法


普里姆:O(n*2) ,与图中边数无关,该算法适合于稠密图.
1)设最小生成树T的V(T)和E(T)均为空。
(2)从顶点集V(G)中任取一顶点加到顶点集V(T)中。                      
(3)在与V(T)中各顶点相关联的所有边中,取一条权值最小的边(Vi,Vj)其中,Vi包含于V(T),Vj含于 V(T)。                                   
(4)将边(Vi,Vj)加入到E(T)中,将顶点Vj到入到V(T)中.(5)若V(T)已满n个顶点,则算法终止,否则转步骤(3)。都是很典型很容易AC的
在这里挑一个最典型的题目贴上代码

/**********************
Author: WHU_Victordu
Created Time: 2008-1-2
File Name: pku1258.cpp
  Description: 
   **************************/

#include <stdio.h>
#define MAXNUM 100000

int dis[101][101],low[101];

int main()
{
    int n,i,j,min,k,sum;
 
    while(scanf("%d",&n)!=EOF)
    {
         sum=0;     
       for(i=0;i<n;i++)
         for(j=0;j<n;j++)
         scanf("%d",&dis[i][j]);
      
       for(i=0;i<n;i++)
       low[i]=dis[0][i];
   
      low[0]=0;
     
      for(i=1;i<n;i++)
      {
        min=MAXNUM;
        j=k=1;
       
        while(j<n)
        {
          if(low[j]&&low[j]<min)
          {
            min=low[j];
            k=j;
          }
          j++;
        }
       
        sum+=low[k];
       
        low[k]=0;
       
        for(j=1;j<n;j++)
        {
          if(dis[k][j]<low[j])
          low[j]=dis[k][j];
        }
        
      }
     
      printf("%d\n",sum);
     
    }
}

你可能感兴趣的:(PKU 1251 1258 2485 最小生成树PRIME)