UVALive-7303 Aquarium (最小生成树)
题目大意:在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 (最小生成树)的更多相关文章
- 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...
- UVALive - 2515 (最小生成树 kruskal)
You are assigned to design network connections between certain points in a wide area. You are given ...
- 最小生成树求最大比率 UVALive - 5713
题目链接:https://vjudge.net/problem/UVALive-5713 题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和 ...
- 最小生成树 prime算法 UVALive - 6437
题目链接:https://vjudge.net/contest/241341#problem/D 这里有多个发电站,需要求出所有点都和发电站直接或间接相连的最小代价,那么就是求出最小生成树的问题了,有 ...
- UVALive - 5713 最小生成树
题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...
- UvaLive 4872 Underground Cables (最小生成树)
题意: 就是裸的最小生成树(MST), 完全图, 边长是实数. 分析: 算是复习一下MST把 方法一: prim 复杂度(n^2) #include <bits/stdc++.h> usi ...
- UVALive 4872 Underground Cables 最小生成树
题目链接: 题目 Underground Cables Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %ll ...
- 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 ...
- 最小生成树的kruskal、prim算法
kruskal算法和prim算法 都说 kruskal是加边法,prim是加点法 这篇解释也不错:这篇 1.kruskal算法 因为是加边法,所以这个方法比较合适稀疏图.要码这个需要先懂并查集.因为我 ...
随机推荐
- Spring学习笔记之初始化和销毁方法的调用次序
Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, a ...
- MATLAB中mexFunction函数的接口规范(转载)
MEX文件的调用极为方便,其调用方式与MATALAB的内建函数完全相同,只需要在命令窗口内输入对应的文件名称即可. C语言MEX程序代码文件有计算子例程(Computational routine)和 ...
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- Ubuntu 14.10 下网络流量实时监控ifstat iftop命令详解
ifstat 介绍 ifstat工具是个网络接口监测工具,比较简单看网络流量 实例 默认使用 #ifstat eth0 eth1 KB/s in KB/s out KB/s in KB/s out 0 ...
- oracle的存储结构
表空间 当一个用户被创建以后,随之就要为用户分配数据存储的空间,这在oracle中成为“表空间”(Tablespace). 在数据库中创建用户时,基于应用性能和管理的考虑,最好为不同的用户创建独立的表 ...
- LeetCode----3 Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- Python的交互式界面 编写 .
from tkinter import * # 导入tkinter模块的所有内容 root = Tk() # 创建一个文本Label对象 textLabel = Label(root, # 将内容绑定 ...
- BZOJ 1954 The xor-longest Path
问题转化为一些数里面选两个数异或和最大. #include<iostream> #include<cstdio> #include<cstring> #includ ...
- JS手机定位地理位置
/** * 以下为html5代码,获取地理位置 */ /** * 设置地址 */ function setAddress(json) { var position = document.getElem ...
- Unity3D ShaderLab 使用alpha参数创建透明效果
Unity3D ShaderLab 使用alpha参数创建透明效果 其实Unity为了方便我们的工作,为我们内置了很多参数.比如马上用到的透明功能. 准备场景新建Shader Material ,一张 ...