zoukankan      html  css  js  c++  java
  • 最小生成树基础 (Kruskal)

    最小生成树
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    Description

    老 Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack 就需要额外再购进跟这两块农田高度差相等长度的管道。 

    现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。
     

    Input

    第一行输入一个数字T(T10),代表输入的样例组数 

    输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1N,M1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。 
     

    Output

    对于每组测试数据输出两行: 

    第一行输出:"Case #i:"。i代表第i组测试数据。 

    第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。
     

    Sample Input

    2 4 3 9 12 4 7 8 56 32 32 43 21 12 12 2 3 34 56 56 12 23 4
     

    Sample Output

    Case #1: 82
    Case #2: 74
     
    //裸的最小生成树,正在学习map的用法,没写完。。。
    上面的话当我没说,我时间复杂度估计错了,直接快排复杂度和二叉树存储的复杂度是一样的。。。。
    裸的最小生成树,因为是稀疏图,用kruskal算法,核心思路就是捡权值小的边用,两边的端点如果不属于同一个集合就合并,直到所有的点都被合并了,这里用到了并查集。
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<algorithm>
      4 using namespace std;
      5 int field[1001][1001];
      6 int abs(int x)
      7 {
      8     return x>0?x:-x;
      9 }
     10 struct str
     11 {
     12     int x;
     13     int y;
     14     int cost;
     15 }e[2000005];
     16 bool kong(str aa,str bb)//对sort的排序策略重新定义
     17 {
     18     return aa.cost<bb.cost;
     19 }
     20 int cnt,tot;//cnt代表边的个数,tot代表集合个数
     21 int fa[1000005];//并查集的father数组
     22 int getfather(int v)
     23 {
     24     if(fa[v]==v)return v;
     25     fa[v]=getfather(fa[v]);
     26     return fa[v];
     27 }
     28 void merge(int x,int y)//把x合并到y的下面
     29 {
     30     int fx,fy;
     31     fx=getfather(x);
     32     fy=getfather(y);
     33     fa[fx]=fy;
     34 }
     35 bool judge(int x,int y)
     36 {
     37     int fx,fy;
     38     fx=getfather(x);
     39     fy=getfather(y);
     40     return (fx==fy);
     41 }
     42 int main()
     43 {
     44     int T;
     45     scanf("%d",&T);
     46     for(int tt=1;tt<=T;tt++)
     47     {
     48         int n,m;
     49         scanf("%d%d",&n,&m);
     50         for(int i=0;i<n;i++)
     51         {
     52             for(int j=0;j<m;j++)
     53             {
     54                 scanf("%d",&field[i][j]);
     55                 fa[i*m+j]=i*m+j;
     56             }
     57         }
     58         cnt=0;tot=n*m;
     59         for(int i=0;i<n-1;i++)
     60         {
     61             for(int j=0;j<m-1;j++)
     62             {
     63                 e[++cnt].x=i*m+j;
     64                 e[cnt].y=(i+1)*m+j;
     65                 e[cnt].cost=abs(field[i][j]-field[i+1][j]);
     66                 e[++cnt].x=i*m+j;
     67                 e[cnt].y=(i)*m+j+1;
     68                 e[cnt].cost=abs(field[i][j]-field[i][j+1]);
     69             }
     70         }
     71         for(int i=0;i<n-1;i++)
     72         {
     73             int j=m-1;
     74             e[++cnt].x=i*m+j;
     75             e[cnt].y=(i+1)*m+j;
     76             e[cnt].cost=abs(field[i][j]-field[i+1][j]);
     77         }
     78         for(int j=0;j<m-1;j++)
     79         {
     80             int i=n-1;
     81             e[++cnt].x=i*m+j;
     82             e[cnt].y=(i)*m+j+1;
     83             e[cnt].cost=abs(field[i][j]-field[i][j+1]);
     84         }
     85         sort(e+1,e+cnt+1,kong);
     86         int sum=0;
     87         for(int i=1;i<=cnt;i++)
     88         {
     89             if(tot==1)break;
     90             if(!judge(e[i].x,e[i].y))
     91             {
     92                 sum+=e[i].cost;
     93                 tot--;
     94                 merge(e[i].x,e[i].y);
     95             }
     96         }
     97         printf("Case #%d:
    %d
    ",tt,sum);
     98     }
     99     return 0;
    100 }
  • 相关阅读:
    BZOJ1251: 序列终结者
    BZOJ1014 [JSOI2008]火星人prefix
    NOI模拟赛Day6
    NOI模拟赛Day5
    BZOJ2329: [HNOI2011]括号修复
    NOI模拟赛Day4
    状压dp题目总结
    BZOJ2097[Usaco2010 Dec] 奶牛健美操
    BZOJ4027: [HEOI2015]兔子与樱花 贪心
    BZOJ1443: [JSOI2009]游戏Game
  • 原文地址:https://www.cnblogs.com/xuwangzihao/p/4996341.html
Copyright © 2011-2022 走看看