cogs——7. 通信线路

本文通过一个具体的案例,详细解析了最小生成树算法的具体实现过程。案例涉及多个城市间的通信线路建设,旨在寻找成本最低的线路布局方案。文章提供了一段完整的C++代码示例,演示了如何使用Kruskal算法解决此类问题。

7. 通信线路

★★   输入文件:mcst.in   输出文件:mcst.out   简单对比
时间限制:1.5 s   内存限制:128 MB

问题描述
假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时, 如何在最少经费的前提下建立这个通信网。在每两个城市之间都可以设置—条线路,相应地都要付出一定的经济代价。n个城市之间,最多可能设置n(n- 1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?
 
【输入格式】
输入文件有若干行
第一行,一个整数n,表示共有n个城市
第2--n+1行,每行n个数,分别表示该城市与其它城市之间路线的费用,如果城市间不能建立通信则用-1表示
 
【输出格式】
一行,1个整数,表示最少总费用
 
【输入输出样例】
 
输入文件
 

-1 5 -1 -1 -1 -1 
5 -1 50 -1 -1 10
-1 50 -1 20 10 -1
-1 -1 20 -1 60 30
-1 -1 10 60 -1 100
-1 10 -1 30 100 -1
 
输出文件
 
75
 
【数据规模】
 
对于40%的数据,保证有n<100: 
对于60%的数据,保证有n<256; 
对于全部的数据,保证有n<=1501。
 
 
复习一下最小生成树
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 5000000
using namespace std;
int n,x,y,z,tot,ans,sum,fa[N];
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;    
}
struct Edge
{
    int x,y,z;
}edge[N];
int cmp(Edge a,Edge b)
{
    return a.z<b.z;
}
int find(int x)
{
    if(fa[x]==x) return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
int main()
{
    freopen("mcst.in","r",stdin);
    freopen("mcst.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
    {
        z=read();
        if(z==-1) continue;
        tot++;
        edge[tot].x=i;
        edge[tot].y=j;
        edge[tot].z=z;
    }
    sort(edge+1,edge+1+tot,cmp);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=tot;i++)
    {
        x=edge[i].x,y=edge[i].y;
        int fx=find(x),fy=find(y);
        if(fx==fy) continue;
        fa[fx]=fy;ans+=edge[i].z;
        sum++;
        if(sum==n-1) break;
    }
    printf("%d",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/7416428.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值