• 【USACO 3.1.1】最短网络


    【描述】

         农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的场。当然,他需要你的帮助。
         约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。
         你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。
    每两个农场间的距离不会超过100000

    【格式】

    PROGRAM NAME: agrinet

    INPUT FORMAT:(file agrinet.in)

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

    OUTPUT FORMAT:(file agrinet.out)

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

    【分析】

    不解释了,裸的最小生成树。

     1 #include <cstdlib>
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <cmath>
     6 #include <algorithm>
     7 const int maxn=100+10;
     8 using namespace std;
     9 struct Edge
    10 {
    11        int u,v;
    12        int w;
    13        bool operator <(const Edge&b)const
    14        {
    15             return w<b.w;
    16        }
    17 }data[maxn*maxn];
    18 int n,map[maxn][maxn];
    19 int parent[maxn],point;//并查集
    20 
    21 int find(int x) {return parent[x]>0?parent[x]=find(parent[x]):x;}
    22 void kruskal();
    23 void merge(int a,int b);//加权法则
    24  
    25 int main()
    26 {
    27     int i,j;
    28     //文件操作
    29     freopen("agrinet.in","r",stdin);
    30     freopen("agrinet.out","w",stdout);
    31     memset(parent,-1,sizeof(parent));
    32     scanf("%d",&n);
    33     for (i=1;i<=n;i++)
    34     for (j=1;j<=n;j++) 
    35     {
    36         int w;
    37         scanf("%d",&w);
    38         //加边 
    39         if (i==j) continue;
    40         data[point].u=i;data[point].v=j;data[point].w=w;
    41         point++;
    42     }
    43     kruskal();
    44     return 0;
    45 }
    46 void kruskal()
    47 {
    48      int ans=0,i;
    49      sort(data,data+point);
    50      for (i=0;i<point;i++)
    51      {
    52          int u=data[i].u,v=data[i].v;
    53          u=find(u);v=find(v);
    54          if (u!=v)
    55          {
    56              merge(u,v);
    57              ans+=data[i].w;
    58          }
    59      }
    60      printf("%d",ans);
    61 }
    62 void merge(int x,int y)
    63 {
    64      x=find(x);y=find(y);
    65      if (parent[x]>parent[y]) {parent[y]+=parent[x];parent[x]=y;}
    66      else  {parent[x]+=parent[y];parent[y]=x;}
    67 }
  • 相关阅读:
    Ubuntu学习
    MYSQL中group_concat有长度限制!默认1024
    关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
    PHP开发接口使用RSA进行加密解密方法
    WebSocket实战之————Workerman服务器的安装启动
    vim 命令图解
    ubuntu下安装Apache+PHP+Mysql
    Ubuntu 下Apache安装和配置
    android调试输出
    使用AsyncTask异步更新UI界面及原理分析
  • 原文地址:https://www.cnblogs.com/hoskey/p/3802889.html
Copyright © 2020-2023  润新知