HDU 1102 Constructing Roads 最小生成树

传送门:HDU 1102 Constructing Roads

分析:
prim模版题目。

代码如下:

#include <stdio.h>
#include <string.h>
int map[105][105],dis[105],vis[105];
int main() {
    int cas,i,j,k,valid,a,b,sumD,min;
    while(scanf("%d",&cas) != EOF) {
        for(i=0; i<cas; i++)
            for(j=0; j<cas; j++)
                scanf("%d",&map[i][j]);
        scanf("%d",&valid);
        for(i=0; i<valid; i++) {
            scanf("%d%d",&a,&b);
            map[a-1][b-1] = map[b-1][a-1] = 0;
        }
        // Prim start
        // init
        sumD = 0;
        memset(vis, 1, sizeof(vis));
        for(i=0; i<cas; i++)
            dis[i] = map[0][i]; // 初始化距离函数
        vis[0] = 0; // already in tree
        // find n-1 dot
        for(i=1; i<cas; i++) {
            min = 1000000;
            // find next nearly dot
            for(j=1; j<cas; j++)
                if(dis[j]<min && vis[j])
                    min = dis[j], k = j;
            vis[k] = 0;
            sumD += min;
            for(j=1; j<cas; j++)
                if(vis[j] && dis[j] > map[k][j])
                    dis[j] = map[k][j];
        }
        printf("%d\n", sumD);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值