Algorithm 最小生成树 prime算法

<span style="font-size:18px;">简单的prime 算法 主要的就是三个部分。一 用dist来记录值,二 找dist 里的最小值,三 更新dist里的值。
所以要写prime算法 要抓住这三个点来写,就能减少错误。(visit用来标记,在判断条件的时候不要忘了)

#include
#include

#define INT_MAX 1000000
#define MAXN 100

int visit[MAXN] ;
int map[MAXN][MAXN] ;
int dist[MAXN] ;

int n , e ;

int prime (int start)
{
    int i ,j ;
    memset(visit , -1 ,sizeof(visit)) ;
    //用dist来保存与start有连接的边上的值
    
    for(i = 1 ; i<=n ; i++)
        dist[i] = map[start][i] ;
    
    dist[start] = 0 ;
    visit[start] = 1 ;
    
    
    for(j = 1 ; j <=  n-1 ;j++){//要循环n-1次
        
        int result = 0 ;        
        int min = dist[start] ;
        int flag ;
        
        //找到dist里的最小值 用min记录,用flag 保存位置
        for(i = 1 ; i <= n ; i++){
            
            if(visit[i] < 0 && min > dist[i])
                min = dist[i] ;
            
            flag = i ;
        }
        
        result += min ;
        visit[flag] = 1 ;
        
        for(i = 1 ; i <= n ; i++ ){
            
            if(visit[i] < 0 && dist[i] > map[flag][i])
                dist[i] = map[flag][i] ;
            
        }
        
    }
        return result ;
    
}

int main()
{
    
    int i , j ;
    
    scanf("%d%d" , &n , &e) ;
    
    //把连接矩阵里的权值都付值为无穷大
    memset(map , INT_MAX , sizeof(map)) ;
    
    //输入各个顶点的信息 ,两个顶点之间的 权值

    int v , u ;
    for(i = 1 ; i <= e ; i++ )
    {
        scanf("%d%d%d", &v , &u , &map[v][u]);
    }
   printf( "%d\n" . prime(1) ) ;
    
    return 0;
}
</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值