农业网

描述

农夫约翰已经当选镇长了!他的一个运动承诺之一是将互联网连接到该地区的所有农场。当然,他需要你的帮助。
农夫约翰为他的农场订了高速连接,并将与其他农民分享他的连接。为了最大限度地降低成本,他希望将最小量的光纤连接到所有其他农场。
给出连接每对农场需要多少纤维的列表,您必须找到将所有纤维连接在一起所需的最小纤维量。每个农场必须连接到一些其他农场,使得数据包可以从任何一个农场流向任何其他农场。
任何两个农场之间的距离不会超过100,000。

输入

输入包括几种情况。对于每种情况,第一行包含农场数N(3 <= N <= 100)。以下行包含N x N个连续矩阵,其中每个元素显示从农场到另一个的距离。在逻辑上,它们是N行的N个空格分隔的整数。在物理上,它们的长度限制在80个字符之间,所以有些行继续到其他字符。当然,对角线将为0,因为距离农场i到自身的距离对于这个问题不是很有意思。

产量

对于每种情况,输出单个整数长度,它是连接整套农场所需的最小纤维长度之和。

样品输入

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

样品输出

28

代码

#include<stdio.h>
#include<string.h>
#define MAXN 210
int cost[MAXN][MAXN];
const int INF=0x3f3f3f3f;
int vis[MAXN];
int lowc[MAXN];
int prim(int cost[][MAXN],int n)//编号从1-n 
{
    int i,j,p;
    int minc,res=0;
    memset(vis,0,sizeof(vis));
    vis[1]=1;
    for(i=1;i<=n;i++)
       lowc[i]=cost[1][i];
    for(i=1;i<n;i++)
    {
        minc=INF;
        p=-1;
        for(j=1;j<=n;j++)
            if(vis[j]==0&&minc>lowc[j])
            {minc=lowc[j];p=j;}
        if(minc==INF)return -1;
        res+=minc;vis[p]=1;
        for(j=1;j<=n;j++)
           if(vis[j]==0&&lowc[j]>cost[p][j])
             lowc[j]=cost[p][j];
    } 
    return res;    
} 
int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
             scanf("%d",&cost[i][j]);
        printf("%d\n",prim(cost,n));
    }  
    return 0;  
}   

测试截图

这里写图片描述

AC截图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值