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

题目分析:将区域视作点,将墙视作边,这样问题就变成了求最小生成树。

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<vector>
# include<list>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long const int INF=1000000000;
const int N=1000;
const double eps=1e-10;
const double inf=1e20; int n,m;
char p[105][105];
int a[105][105];
int vis[105][105][2]; struct Edge
{
int fr,to,w;
bool operator < (const Edge &a) const{
return w<a.w;
}
};
Edge e[20000];
int fa[20000]; bool ok(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
} void dfs(int x,int y,int f,int cnt)
{
vis[x][y][f]=cnt;
if(p[x][y]=='\\'){
if(f==1){
if(ok(x,y-1)){
if(p[x][y-1]=='\\'&&vis[x][y-1][0]==-1) dfs(x,y-1,0,cnt);
if(p[x][y-1]=='/'&&vis[x][y-1][1]==-1) dfs(x,y-1,1,cnt);
}
if(ok(x+1,y)&&vis[x+1][y][0]==-1)
dfs(x+1,y,0,cnt);
}else{
if(ok(x-1,y)&&vis[x-1][y][1]==-1)
dfs(x-1,y,1,cnt);
if(ok(x,y+1)){
if(p[x][y+1]=='\\'&&vis[x][y+1][1]==-1) dfs(x,y+1,1,cnt);
if(p[x][y+1]=='/'&&vis[x][y+1][0]==-1) dfs(x,y+1,0,cnt);
}
}
}else{
if(f==1){
if(ok(x,y+1)){
if(p[x][y+1]=='\\'&&vis[x][y+1][1]==-1) dfs(x,y+1,1,cnt);
if(p[x][y+1]=='/'&&vis[x][y+1][0]==-1) dfs(x,y+1,0,cnt);
}
if(ok(x+1,y)&&vis[x+1][y][0]==-1)
dfs(x+1,y,0,cnt);
}else{
if(ok(x-1,y)&&vis[x-1][y][1]==-1)
dfs(x-1,y,1,cnt);
if(ok(x,y-1)){
if(p[x][y-1]=='\\'&&vis[x][y-1][0]==-1) dfs(x,y-1,0,cnt);
if(p[x][y-1]=='/'&&vis[x][y-1][1]==-1) dfs(x,y-1,1,cnt);
}
}
}
} int find_fa(int x)
{
int u=x;
while(fa[u]!=u)
u=fa[u];
while(fa[x]!=u){
int t=x;
x=fa[x];
fa[t]=u;
}
return u;
} int main()
{
int T;
scanf("%d",&T);
int cas=0;
while(T--)
{
scanf("%d%d",&n,&m);
memset(vis,-1,sizeof(vis));
for(int i=0;i<n;++i)
scanf("%s",p[i]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
scanf("%d",&a[i][j]);
int cnt=0;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(vis[i][j][0]==-1){
dfs(i,j,0,cnt);
++cnt;
}
if(vis[i][j][1]==-1){
dfs(i,j,1,cnt);
++cnt;
}
}
}
int k=0;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(vis[i][j][0]==vis[i][j][1]) continue;
e[k].fr=vis[i][j][0];
e[k].to=vis[i][j][1];
e[k].w=a[i][j];
++k;
}
}
sort(e,e+k);
for(int i=0;i<cnt;++i)
fa[i]=i;
int ans=0;
for(int i=0;i<k;++i){
int f1=find_fa(e[i].fr);
int f2=find_fa(e[i].to);
if(f1!=f2){
ans+=e[i].w;
fa[f1]=f2;
}
}
printf("Case %d: %d\n",++cas,ans);
}
return 0;
}

  

UVALive-7303 Aquarium (最小生成树)的更多相关文章

  1. 训练指南 UVALive - 5713(最小生成树 + 次小生成树)

    layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...

  2. UVALive - 2515 (最小生成树 kruskal)

    You are assigned to design network connections between certain points in a wide area. You are given ...

  3. 最小生成树求最大比率 UVALive - 5713

    题目链接:https://vjudge.net/problem/UVALive-5713 题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和 ...

  4. 最小生成树 prime算法 UVALive - 6437

    题目链接:https://vjudge.net/contest/241341#problem/D 这里有多个发电站,需要求出所有点都和发电站直接或间接相连的最小代价,那么就是求出最小生成树的问题了,有 ...

  5. UVALive - 5713 最小生成树

    题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...

  6. UvaLive 4872 Underground Cables (最小生成树)

    题意: 就是裸的最小生成树(MST), 完全图, 边长是实数. 分析: 算是复习一下MST把 方法一: prim 复杂度(n^2) #include <bits/stdc++.h> usi ...

  7. UVALive 4872 Underground Cables 最小生成树

    题目链接: 题目 Underground Cables Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %ll ...

  8. POJ 1502 MPI Maelstrom / UVA 432 MPI Maelstrom / SCU 1068 MPI Maelstrom / UVALive 5398 MPI Maelstrom /ZOJ 1291 MPI Maelstrom (最短路径)

    POJ 1502 MPI Maelstrom / UVA 432 MPI Maelstrom / SCU 1068 MPI Maelstrom / UVALive 5398 MPI Maelstrom ...

  9. 最小生成树的kruskal、prim算法

    kruskal算法和prim算法 都说 kruskal是加边法,prim是加点法 这篇解释也不错:这篇 1.kruskal算法 因为是加边法,所以这个方法比较合适稀疏图.要码这个需要先懂并查集.因为我 ...

随机推荐

  1. MSP430x1_4_6x之问题总结

    01:MSP430端口上电复位的初始值是不确定的:所以使用是都要初始化:比如加下面的语句或者加你使用的端口就行了:  /*下面六行程序关闭所有的IO口*/    P1DIR = 0XFF;P1OUT ...

  2. Android模拟器配置选项说明

    Memory Options是模拟器的运行内存大小,类比电脑内存大小,就是在设置->应用程序中,正在运行标签页下面显示的那个大小Internal storage是模拟器内置存储空间大小,用于存放 ...

  3. sidePagination: "server"和responseHandler: responseHandler

    bootstrapTable()中有两个属性 一个是sidePagination,表示服务器分页,responseHandler:responseHandler 表示回应操作的rows和total 两 ...

  4. Ubuntu 14.10 下Server版本中文乱码问题

    在安装Ubuntu server 14.10 时候选择了中文版,但是装好系统发现,里面的中文有乱码,解决办法 打开 /etc/default/locale sudo nano /etc/default ...

  5. linux基础命令学习(一)

    pwd 输出当前工作路径tree 以树状图列出目录的内容ctrl+c 取消命令的执行clear 清空屏幕ls 列出文件目录 蓝色是目录,白色是普通文件alias cls=clear 别名终端:本地终端 ...

  6. 技术分享:逆向分析ATM分离器

    文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...

  7. STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort

    最近在看 侯捷的 STL源码分析,发现了以下的这个list 排序算法,乍眼看去,实在难以看出它是归并排序. 平常大家写归并排序,通常写的是 递归版本..为了效率的考虑,STL库 给出了如下的 归并排序 ...

  8. CPP,MATLAB实现牛顿插值

    牛顿插值法的原理,在维基百科上不太全面,具体可以参考这篇文章.同样贴出,楼主作为初学者认为好理解的代码. function p=Newton1(x1,y,x2) %p为多项式估计出的插值 syms x ...

  9. Tips about Object-oriented programming

    1, Return subinterface For example, we have a parent interface: public interface A<T extends A< ...

  10. arcgis显示其他国家语言

    接手一个韩国的项目,需要在arcmap中配置一个韩国地图并发布到arcserver中进行切图,给的韩国地图的shapefile文件中属性字段都是韩文的,在中文的系统中,arcMap中显示的韩文都是乱码 ...