题目大意:在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. 站在K2角度审视流程--任务的独占与释放

    应用场景一:某件事情由A.B两人(或者更多人)完成,任务开始后,两人随时可以处理任务,只需有一人处理完成,此事情即可结束. 应用场景二:某件事情由A.B两人(或者更多人)完成,任务开始后,两人随时可以 ...

  2. CSU 1021 B(Contest #3)

    Description 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数.组合数的计算公式如下: C(m, n) = m!/((m - n)!n! ...

  3. CCNA 6.3

    no encapsulation ppp(默认是encapsulation hdlc 在encapsulation ppp 后想要改回 hdlc 除了可用encapsulation hdlc外,还可以 ...

  4. 在oracle中创建空间索引

    Oracle spatial可以方便的存储空间数据,大量的空间数据必需要使用空间索引去查询.在oracle中创建空间索引必需先建立元数据,否则无法创建索引.创建元数据的代码: insert into ...

  5. 国产ProcessOn和国外gliffy的对比区别【原创】

    之前一直在用国外的作图工具gliffy,不足之处gliffy是英文的,很多国内相关从业者使用起来就有一定门槛,今天我给大家再推荐一款比gliffy更方便的作图工具ProcessOn,除了绘制UML建模 ...

  6. <转>thinkphp的各种内部函数 D()、F()、S()、C()、L()、A()、I()详解

    D.F.S.C.L.A.I 他们都在functions.php这个文件家下面我分别说明一下他们的功能 D() 加载Model类M() 加载Model类 A() 加载Action类L() 获取语言定义C ...

  7. PED结构获取进程路径和命令行地址

    1.FS寄存器 2.进入FS寄存器地址,7FFDD000 3.偏移30为PED结构 4.偏移地址10 3C,44偏移:路径地址,命令行地址 // 通过PEB结构去查找所有进程模块 void *PEB ...

  8. jsp MVC学习笔记

    Model层: 四个包: com.maker.bean存放数据库里面的字段信息. package com.maker.bean; public class User { private String ...

  9. Ubuntu系统下运行Eclipse出现找不到jre的问题的解决方法

    在Ubuntu的某些版本下,比如10.10,会出现以下奇怪问题: 1. 安装jdk 我下载的jdk是bin格式的,直接运行解压,得到一个文件夹. 这个文件夹作为jdk的安装目录,可以拷贝到任意目录. ...

  10. PHP文件系统处理(二)

    1.文件的打开和关闭(读文件中的内容,向文件中写内容)            读取文件中的内容                file_get_contents()     //php5以上 < ...