1024

/*普里姆算法,Prim 
**最小生成树,n个顶点,用n-1条边把一个连通图链接起来,并且使得权值的和最小。 
我们把构造连通网的最小代价生成树称为最小生成树。 
*/
#include<stdio.h> 
  
#define DEBUG_IO (0) 
  
const int MAX = 201; 
const int INF = 65535; 
  
int main() 
{ 
#if DEBUG_IO  
    freopen("input.txt", "r", stdin);  
    setbuf(stdout, NULL);  
#endif 
    int i, j, k, x, y, v; 
    int answer; 
    int V; 
    int E; 
    scanf("%d %d", &V, &E); 
      
    int vis[MAX] = {0}; 
    int low[MAX] = {0}; 
    int map[MAX][MAX] = {0}; 
  
    for(i = 1; i <= V; i++) 
    { 
        for(j = 1; j <= V; j++) 
        { 
            map[i][j] = INF; 
        } 
    } 
      
    //把输入转换为邻接矩阵 
    for(i = 0; i < E; i++) 
    { 
        scanf("%d %d %d", &x, &y, &v); 
        map[x][y] = map[y][x] = v; 
    } 
  
    //初始化数组为最大值 
    for(i = 0; i < MAX; i++) 
    { 
        low[i] = INF; 
    } 
  
    low[1] = 0; 
    vis[1] = 1; 
  
    //初始化第一个顶点到其他点的权值,存进low数组 
    for(i = 2; i <= V; i++) 
    { 
        if(low[i] > map[1][i]) 
        { 
            low[i] = map[1][i]; 
        } 
    } 
      
    //遍历V-1次,每个点更新一次 
    for(i = 2; i <= V; i++) 
    { 
        int min = INF; 
          
        j = 2; 
        k = 0; 
        //每一轮挑出low数组里面最小值 
        while(j <= V) 
        { 
            if(vis[j] == 0 && low[j] < min) 
            { 
                min = low[j]; 
                k = j; 
            } 
            j++; 
        } 
          
        vis[k] = 1; //每一轮挑出的最小值存放进low数组 
  
        //新最小值到达其余点的权值更新进low数组 
        for(j = 2; j <= V; j++) 
        { 
            if(vis[j] == 0 && low[j] > map[k][j] + low[k])//更新新的最小值的可达点 
            { 
                low[j] = map[k][j] + low[k]; 
            } 
        } 
    } 
  
    answer = 0; 
    for(i = 2; i <= V; i++) 
    { 
        answer += low[i]; 
    } 
  
    printf("%d", answer); 
    return 0; 
} 
/************************************************************** 
    Problem: 1024 
    User: lin005 
    Language: C++ 
    Result: 正确 
    Time:10 ms 
    Memory:448 kb 
****************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值