• 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;

                  }

           }

    }

  • 相关阅读:
    hdu 3006 The Number of set(思维+壮压DP)
    Mysql-SQL优化-统计某种类型的个数
    canvas.clipPath canvas.clipRect() 无效的原因
    linux下alias命令具体解释
    使用带粒子效果的 CAEmitterLayer
    Wordpress 建站(一)
    一个有趣的问题:ls -l显示的内容中total究竟是什么?
    (转)奇妙的数据挖掘
    android几个高速打包命令
    hdu3336解读KMP算法的next数组
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290497.html
Copyright © 2020-2023  润新知