湖工oj 1162 大武汉局域网

Problem Description
大武汉一直流传着这样一个传说:
玩在武大,学在华科,爱在华师,吃在湖工。。。
大武汉有N所高校,现在打算在他们之间建立一个局域网,使它们之间能够相互连通。
但是铺网线是要钱的。。。
怎样才能找到一个最省钱的方法呢。
 
Input
输入包含多组测试数据
第一行给出学校的数目N,(3 <= N <= 110);
接下来一个N*N的矩阵,代表学校i到学校j铺设网络的花费
 
 
Output
输出花钱最少的钱数
(所有数值小于2^31)
 
Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
 
Sample Output

28  
此题是基本的最小生成树的应用,下面是prim算法
#include<stdio.h>
int a[111][111];
typedef struct{
    int adj;//保存符合要求的点
    int lowcost;//某顶点与已构造好的部分生成树的顶点之间的最小权值
}closeedge;//辅助结构体
closeedge close[111];//辅助数组
int main()
{
    int n,i,j,min,sum,k;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;//记录最小生成树的总权值
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        for(i=2;i<=n;i++)//辅助数组初始化,这里我先把1这个顶点拉入到生成树中
        {
            close[i].adj=1;
            close[i].lowcost=a[1][i];
        }
        close[1].lowcost=0;//1顶点进入最小生成树中
        for(i=1;i<n;i++)//寻找其余n-1个顶点
        {
            min=2147483647;
            for(j=1;j<=n;j++)//找到符合要求的最小权值点
                if(close[j].lowcost<min&&close[j].lowcost!=0)
                {
                    min=close[j].lowcost;
                    k=j;
                }
            sum+=min;
            close[k].lowcost=0;//顶点k进入生成树
            for(j=1;j<=n;j++)//新顶点进入生成树之后,修改辅助数组
                if(a[k][j]<close[j].lowcost)
                {
                    close[j].adj=k;
                    close[j].lowcost=a[k][j];
                }
        }
        printf("%d\n",sum);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/duan-to-success/p/3508183.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值