码迷,mamicode.com
首页 > 其他好文 > 详细

cogs 7. 通信线路

时间:2017-08-23 10:29:04      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:http   printf   das   round   pen   print   生成   can   std   

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。
 
思路:最小生成树板子。
错因:存边数组没开2倍。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 2325750
#define M 2510
using namespace std;
int n,tot,fa[M],num,ans;
struct nond{
    int x,y,z;
}edge[MAXN];
int cmp(nond a,nond b){
    return a.z<b.z;
}
int find(int x){
    if(fa[x]==x)    return fa[x];
    else return fa[x]=find(fa[x]);
}
int main(){
    freopen("mcst.in","r",stdin);
    freopen("mcst.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            int x;
            scanf("%d",&x);
            if(x!=-1){
                edge[++tot].x=i;
                edge[tot].y=j;
                edge[tot].z=x;
            }
        }
    sort(edge+1,edge+1+tot,cmp);
    for(int i=1;i<=n;i++)    fa[i]=i;
    for(int i=1;i<=tot;i++){
        int dx=find(edge[i].x);
        int dy=find(edge[i].y);
        if(dx==dy)    continue;
        fa[dx]=dy;
        num++;
        ans+=edge[i].z;
        if(num==n-1)    break;
    }
    printf("%d",ans);
}

 

cogs 7. 通信线路

标签:http   printf   das   round   pen   print   生成   can   std   

原文地址:http://www.cnblogs.com/cangT-Tlan/p/7416297.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!