zoukankan      html  css  js  c++  java
  • 18.最小生成树(kruskal算法)

    最小生成树(kruskal算法)

    时间限制: 1 s

     空间限制: 128000 KB

     题目等级 : 白银 Silver

    题解

     查看运行结果

    题目描述 Description

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

    输入描述 Input Description

    第一行: 农场的个数,N(3<=N<=100)。

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

    输出描述 Output Description

    只有一个输出,是连接到每个农场的光纤的最小长度和。

    样例输入 Sample Input

    4

    0  4  9 21

    4  0  8 17

    9  8  0 16

    21 17 16  0

    样例输出 Sample Output

    28

    代码:

    #include

    #include

    #include

    using namespace std;

    #include

    #define maxn 101

    #define maxw 100001

    int father[maxn],n,t,k=0;

    long long tot=0;

    struct Edge{

           int u,v,w;

    };

    Edge edge[maxn*maxn];

    void input();

    void kruskal();

    int find(int);

    void unionn(int,int);

    int main()

    {

           input();

           kruskal();

           printf("%lld",tot);

           return 0;

    }

    void input()

    {

           scanf("%d",&n);

           t=0;

           for(int i=1;i<=n;++i)

             for(int j=1;j<=n;++j)

             {

                 edge[++t].u=i;

                 edge[t].v=j;

                 scanf("%d",&edge[t].w);

             }

    }

    int find(int x)

    {

           if(father[x]!=x) father[x]=find(father[x]);

           return father[x];

    }

    void unionn(int a,int b)

    {

           father[b]=a;

    }

    int cmp(const Edge &a,const Edge &b)

    {

           return a.w

    }

    void kruskal()

    {

           for(int i=1;i<=n;++i)

           father[i]=i;

           sort(edge+1,edge+1+t,cmp);

           for(int i=1;i<=t;++i)

           {

                  int r1=find(edge[i].u);

                  int r2=find(edge[i].v);

                  if(r1!=r2)

                  {

                         unionn(r1,r2);

                         tot+=edge[i].w;

                         k++;

                         if(k==n-1) return;

                  }

           }

    }

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290299.html
Copyright © 2011-2022 走看看