USACO Agri-Net

来源:互联网 发布:近几年海外代购数据 编辑:程序博客网 时间:2024/05/16 05:44

题目背景

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。

题目描述

约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000

输入输出格式

输入格式:

第一行: 农场的个数,N(3<=N<=100)。
第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

输出格式:

只有一个输出,其中包含连接到每个农场的光纤的最小长度。

输入输出样例

输入样例

40 4 9 214 0 8 179 8 0 1621 17 16 0

输出样例

28

sx模板题,最小生成树搞一搞

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int size = 450;int dist[size][size];int f[size];int find(int x){    if(f[x] == x)        return x;    return f[x] = find(f[x]);}int n;struct dc{    int f,t,d;}l[size*12450];bool cmp(dc a,dc b){    return a.d < b.d;}int tot = 0;int main(){    scanf("%d",&n);    for(int i = 1 ; i <= n ; f[i] = i , i ++);    for(int i = 1 ; i <= n ; i ++)        for(int j = 1 ; j <= n ; j ++)            scanf("%d",&dist[i][j]);    for(int i = 1 ; i <= n ; i ++)    {        for(int j = i + 1 ; j <= n ; j ++)        {            l[++tot].f = i;            l[tot].t = j;            l[tot].d = dist[i][j];            l[++tot].f = j;                        l[tot].t = i;            l[tot].d = dist[i][j];        }    }    sort(l+1,l+tot+1,cmp);    int ans = 0;    for(int i = 1 ; i <= tot ; i ++)    {        int x = find(l[i].f);        int y = find(l[i].t);        if(x != y)        {            ans += l[i].d;            f[x] = y;        }    }    cout<<ans;    return 0;}
0 0
原创粉丝点击