题意:给R*C的房间,每个房间被左上-右下或右上-左下的墙分割为两个小房间,将分割移除有一定花费,问使所有小房间联通需要的最小花费

把每个房间分成左右(上下?)两个点,判一判,本来就联通的加零边,一个房间里的两个点间加花费的边,跑kruskal即可

 #include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
const int maxN=; typedef struct{
int a,b,l;
}Edge; Edge eg[maxN*maxN];
bool stage[maxN][maxN]; //true->\ false->/
int bcj[maxN*maxN*]; //(i-1)*C+j
int T,R,C; bool cmp(Edge a,Edge b){
return a.l<b.l;
} int getf(int i){
return bcj[i]==i?i:bcj[i]=getf(bcj[i]);
} void add(int a,int b){ //a->b
bcj[getf(a)]=getf(b);
} int main(){
int t,i,j,k,ind,a,b,num,ans;
char cr; scanf("%d",&T);
for(t=;t<=T;t++){
scanf("%d%d\n",&R,&C);
for(i=;i<=R;i++){
for(j=;j<=C;j++){
scanf("%c",&cr);
stage[i][j]=(cr=='\\');
}
if(i<R) scanf("\n");
}
ind=;
for(i=;i<=R;i++){
for(j=;j<=C;j++){
eg[ind].a=(i-)*C*+j*-;
eg[ind].b=(i-)*C*+j*;
scanf("%d",&eg[ind++].l);
}
}
for(i=;i<=R;i++){
ind=(i-)*C*;
bcj[ind+]=ind+;
bcj[ind+C*]=ind+C*;
for(j=;j<C;j++){
bcj[ind+j*]=ind+j*;
bcj[ind+j*+]=ind+j*;
}
}
for(i=;i<R;i++){
for(j=;j<=C;j++){
ind=(i-)*C*+j*;
a=stage[i][j]?ind-:ind;
b=stage[i+][j]?ind+C*:ind+C*-;
add(a,b);
}
}
sort(eg,eg+R*C,cmp); ans=;
for(i=;i<R*C;i++){
if(getf(eg[i].a)!=getf(eg[i].b)){
add(eg[i].a,eg[i].b);
ans+=eg[i].l;
}
}
printf("Case %d: %d\n",t,ans); }
}

uvaLive7303 Aquarium (kruskal)的更多相关文章

  1. UVALive-7303 Aquarium (最小生成树)

    题目大意:在nxm的方格中,每一个1x1的小方格中都有一堵沿对角线的墙,并且每堵墙都有一个坚固程度,这些墙将nxm的方格分割成了若干个区域.现在要拆除一些墙,使其变成一个区域. 题目分析:将区域视作点 ...

  2. c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树

    c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路 ...

  3. 最小生成树之克鲁斯卡尔(Kruskal)算法

    学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...

  4. 克鲁斯卡尔(Kruskal)算法

    概览 相比于普里姆算法(Prim算法),克鲁斯卡尔算法直接以边为目标去构建最小生成树.从按权值由小到大排好序的边集合{E}中逐个寻找权值最小的边来构建最小生成树,只要构建时,不会形成环路即可保证当边集 ...

  5. 最小生成树练习2(Kruskal)

    两个BUG鸣翠柳,一行代码上西天... hdu4786 Fibonacci Tree(生成树)问能否用白边和黑边构成一棵生成树,并且白边数量是斐波那契数. 题解:分别优先加入白边和黑边,求出生成树能包 ...

  6. 最小生成树(Kruskal)

    题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...

  7. 这是一篇每个人都能读懂的最小生成树文章(Kruskal)

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树. 我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到 ...

  8. 查找最小生成树:克鲁斯克尔算法(Kruskal)算法

    一.算法介绍 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应用.和 ...

  9. 最小生成树--克鲁斯卡尔算法(Kruskal)

    按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...

随机推荐

  1. SpringMVC controller 时间 T

    Spring MVC 之 处理Date类型 - carl.zhao的专栏 - CSDN博客https://blog.csdn.net/u012410733/article/details/727730 ...

  2. ntpd、ntpdate、hwclock的区别

    hwclock --systohc 使用ntpdate更新系统时间 - 潜龙勿用 - CSDN博客https://blog.csdn.net/suer0101/article/details/7868 ...

  3. JMeter学习FTP测试计划(转)

    FTP服务主要提供上传和下载功能.有时间需要我们测试服务器上传和下载的性能.在这里我通过JMeter做一个FTP测试计划的例子. 1.创建一个线程组 2.线程组--->添加--->配置元件 ...

  4. 了解真实的rem手机屏幕适配

    rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...

  5. toTree

    // js实现树级递归, // 通过js生成tree树形菜单(递归算法) const data = [ { id: 1, name: "办公管理", pid: 0 }, { id: ...

  6. 工程下CmakeLists.txt

    2.工程下Cmake 本小节的任务是让上一小结的程序更像一个工程: 为工程添加一个子目录 src,用来放置工程源代码 : 添加一个子目录doc,用来放置这个工程的文档 hello.txt: 在工程目录 ...

  7. 给普通用户添加root权限

    >>提君博客原创  http://www.cnblogs.com/tijun/  << 第一步,以root用户查看/etc/sudoers [root@ltt2 hadoop] ...

  8. Saltstack 安装与常用模块

    一.介绍 saltstack是基于C/S服务模式,在该架构中,服务器端叫做Master,客户端叫做Minion.传统的C/S模式我们这样理解,客户端发送请求给服务器端,服务器端接受到来自客户端的请求并 ...

  9. How to ssh

    ssh -p 22 cuthead@127.0.0.1

  10. luogu3702-[SDOI2017]序列计数

    Description Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知 ...