25.最小生成树(kruskal算法)

时间限制: 1 s

 空间限制: 128000 KB

 题目等级 : 白银 Silver

题解

 查看运行结果

题目描述 Description

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

输入描述 Input Description

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

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

输出描述 Output Description

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

样例输入 Sample Input

4

9 21

8 17

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;

              }

       }

}

原文地址:https://www.cnblogs.com/csgc0131123/p/5290497.html