HDU1301 Jungle Roads(普里姆算法版)

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2403

#include  < iostream >
#include 
< limits >
using   namespace  std;

int  n;
const   int  MAX_VETEXT_NUM  =   27 ;
int  map[MAX_VETEXT_NUM][MAX_VETEXT_NUM];
int  closedge[MAX_VETEXT_NUM];

int  prim()
{
    
int  v[MAX_VETEXT_NUM]; // 顶点集合
     int  i,j,k,sum;
    sum 
=   0 ;
    k 
=   0 ; // 初始点为'A'
     for  (i  =   0 ; i  <  MAX_VETEXT_NUM;  ++ i)
    {
        
if  (i  !=  k)
        {
            closedge[i] 
=  map[k][i];
            v[i] 
=   0 ;
        }
    }
    v[k] 
=   1 ; // 'A'点并入集合中
     for  (i  =   1 ; i  <  MAX_VETEXT_NUM;  ++ i)
    {
        
int  min  =  numeric_limits < int > ::max();
        
// 选择k
         for  (j  =   0 ; j  <  MAX_VETEXT_NUM;  ++ j)
        {
            
if  ( ! v[j]  &&  (closedge[j]  !=   0 &&  (closedge[j]  <  min))
            {
                min 
=  closedge[j];
                k 
=  j;
            }
        }
        
if  (min  ==  numeric_limits < int > ::max())
        {
            
break ;
        }
        sum 
+=  min;
        v[k] 
=   1 ; // k个顶点并入集合
        
// 从k顶点出发有更短的边
         for  (j  =   0 ; j  <  MAX_VETEXT_NUM;  ++ j)
        {
            
if  (map[k][j]  <  closedge[j])
            {
                closedge[j] 
=  map[k][j];
            }
        }
    }
    
return  sum;
}
int  main()
{
    
int  i,j;
    
char  chStart,chEnd;
    
int  nOutEdges,nValue;
    
while  (cin  >>  n  &&  n  !=   0 )
    {
        
//  初始化图
         for ( i  =   0  ; i  <  n ; i ++  )
        {
            
for ( j  =   0  ; j  <  n ; j  ++  )
            {
                map[i][j] 
=  map[j][i]  =  numeric_limits < int > ::max() ;
            }
        }
        
for  (i  =   0 ; i  <  n - 1 ++ i)
        {
            cin 
>>  chStart  >>  nOutEdges;
            
for  (j  =   0 ; j  <  nOutEdges;  ++ j)
            {
                cin 
>>  chEnd  >>  nValue;
                map[chStart 
-   ' A ' ][chEnd  -   ' A ' =  nValue;
                map[chEnd 
-   ' A ' ][chStart  -   ' A ' =  nValue;
            }
        }
        cout 
<<  prim()  <<  endl;
    }
    
return   0 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值