【Dijkstra堆优化】洛谷P2243电路维修
题目背景
Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上。在她无依无靠的时候,善良的运输队员Mark 和James 收留了她。Elf 很感谢Mark和James,可是一直也没能给他们帮上什么忙。
题目描述
有一天 Mark 和James 的飞行车没有办法启动了,经过检查发现原来是电路板的故障。飞行车的电路板设计很奇葩,如下图所示:

输入输出格式
输入格式:
输入文件包含多组测试数据。第一行包含一个整数T 表示测试数据的数目。
对于每组测试数据,第一行包含正整数 R 和C,表示电路板的行数和列数。
之后 R 行,每行C 个字符,字符是"/"和"\"中的一个,表示标准件的方向。
对于40% 的数据,R,C≤5。
对于 100% 的数据,R,C≤500,T≤5。
输出格式:
对于每组测试数据,在单独的一行输出一个正整数,表示所需的缩小旋转次数。
如果无论怎样都不能使得电源和发动机之间连通,输出 NO SOLUTION。
输入输出样例
1
3 5
\\/\\
\\///
/\\\\
1
说明
样例的输入对应于题目描述中的情况。
只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。

题解
把一个格子拆成四个点,左上到右下和右上到左下分别连边,如果实际有边,则令边权为0,无则为1,求最短路
注意是稠密图,只能用堆优化的dijkstra
代码
一维做法:
//by 减维
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#define ll long long
#define inf 1<<30
using namespace std; struct edge{
int to,v,ne;
}e[**+]; struct node{
int x,v;
bool operator < (const node& b)const
{
return v>b.v;
}
}; int t,n,m,ecnt,head[*],dis[*];
bool vis[*]; void add(int x,int y,int z)
{
e[++ecnt].to=y;
e[ecnt].v=z;
e[ecnt].ne=head[x];
head[x]=ecnt;
} void dij(int x)
{
memset(vis,,sizeof(vis));
priority_queue<node>q;
q.push((node){x,});
dis[x]=;
while(!q.empty())
{
node d=q.top();
q.pop();
if(vis[d.x])continue;
vis[d.x]=;
for(int i=head[d.x];i;i=e[i].ne)
{
int dd=e[i].to;
if(dis[dd]>dis[d.x]+e[i].v)
{
dis[dd]=dis[d.x]+e[i].v;
if(!vis[dd])q.push((node){dd,dis[dd]});
}
}
}
} int main()
{
scanf("%d",&t);
while(t--)
{
ecnt=;
memset(head,,sizeof(head));
memset(e,,sizeof(e));
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
char a[];
scanf("%s",a+);
for(int j=;j<=m;++j)
{
int x1=(i-)*(m+)+j,x2=(i-)*(m+)+j+,x3=i*(m+)+j,x4=i*(m+)+j+;
if(a[j]=='/')
{
add(x1,x4,),add(x4,x1,);
add(x2,x3,),add(x3,x2,);
}else{
add(x1,x4,),add(x4,x1,);
add(x2,x3,),add(x3,x2,);
}
}
}
for(int i=;i<=(n+)*(m+);++i)dis[i]=inf;
dij();
if(dis[(n+)*(m+)]==inf)printf("NO SOLUTION\n");
else printf("%d\n",dis[(n+)*(m+)]);
}
}
二维做法:
//by 减维
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std; struct edge{
int tx,ty,v,ne;
}e[**+]; struct node{
int x,y,v;
bool operator < (const node& b)const
{
return v>b.v;
}
}; int t,n,m,ecnt,head[][],dis[][];
char a[];
bool vis[][]; void add(int xa,int xb,int ya,int yb,int v)
{
e[++ecnt].tx=ya;
e[ecnt].ty=yb;
e[ecnt].v=v;
e[ecnt].ne=head[xa][xb];
head[xa][xb]=ecnt;
} void dij(int xa,int xb)
{
memset(dis,0x7f,sizeof(dis));
memset(vis,,sizeof(vis));
priority_queue<node> q;
dis[xa][xb]=;
q.push((node){xa,xb,});
while(!q.empty())
{
node d=q.top();
q.pop();
if(vis[d.x][d.y])continue;
vis[d.x][d.y]=;
for(int i=head[d.x][d.y];i;i=e[i].ne)
{
int dx=e[i].tx,dy=e[i].ty;
if(dis[dx][dy]>dis[d.x][d.y]+e[i].v)
{
dis[dx][dy]=dis[d.x][d.y]+e[i].v;
if(!vis[dx][dy])q.push((node){dx,dy,dis[dx][dy]});
}
}
}
} int main()
{
scanf("%d",&t);
while(t--)
{
ecnt=;
memset(head,,sizeof(head));
memset(e,,sizeof(e));
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
scanf("%s",a+);
for(int j=;j<=m;++j)
{
if(a[j]=='/')add(i,j+,i+,j,),add(i+,j,i,j+,),add(i,j,i+,j+,),add(i+,j+,i,j,);
else add(i,j+,i+,j,),add(i+,j,i,j+,),add(i,j,i+,j+,),add(i+,j+,i,j,);
}
}
dij(,);
if(dis[n+][m+]!=dis[][])printf("%d\n",dis[n+][m+]);
else printf("NO SOLUTION\n");
}
}
【Dijkstra堆优化】洛谷P2243电路维修的更多相关文章
- 洛谷 P2243 电路维修
P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- 洛谷P2243 电路维修 [最短路]
题目传送门 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- 洛谷P2243 电路维修
题目地址 转化为图论问题 对于每个交叉点(X,Y)抽象成节点.与它相邻的四个点中,可以直接连线的边权为0,否则边权为1. 用死了的SPFA解决图论问题. #include <cstring> ...
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
- POJ2387(dijkstra堆优化)
Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much s ...
- 洛谷P2242 公路维修问题
To 洛谷.2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且 ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- P2243 电路维修
P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
随机推荐
- [Android] AutoCompleteTextView:自己主动完毕输入内容的控件(自己主动补全)
AutoCompleteTextView是EditText的直接子类,与普通EditText的最大不同就是.在用户输入的过程中,能够列出可供选择的输入项.方便使用者. AutoCompleteText ...
- NHibernate之旅(13):初探马上载入机制
本节内容 引入 马上载入 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的载入机制--延迟载入.其本质就是使用GoF23中代理模式 ...
- Android 夜间模式changeskin小结
@author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...
- 浏览器正确理解和使用GBK及UTF-8(UTF-8 + BOM)网页编码
网页编码英文译为web page encoding.是在网页中指定其特定的字符编码格式的库. GBK是国家标准GB2312基础上扩容后兼容GB2312的标准. GBK的文字编码是用双字节来表示的.即不 ...
- 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接
前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...
- 通过第三方工具体验Microsoft Graph
作者:陈希章 发表于 2017年3月22日 上一篇文章我介绍了如何利用官方提供的Graph 浏览器快速体验Microsoft Graph强大功能,这是极好的起点.官方的Graph浏览器力图用最简单的方 ...
- UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 46:illegal multibyte sequence
一. 最近使用python写入文件时,出现了如下的错误: 但是content的内容是unicode编码,不知道怎么和gbk扯上了关系,对content使用encode()和decode(),用gbk, ...
- Material使用08 MdDialogModule、MdAutocompleteModule
1 MatDialog 1.1 简要描述 MdDialog是一个服务,可以利用它来打开一个具有material风格和动画效果的对话框 技巧01:虽然已经在模块级别导入了MdDialogModule但是 ...
- nginx转发tomcat请求转成https后页面不能下载apk文件而是直接打开
访问域名下面的apk文件 https://xxxx/xxx.apk 浏览器没有下载而是直接打开了文件 没有找到问题原因,可能是https的原因,要是用http就可以下载,转发https就有问题 后来是 ...
- python运算符优先级问题
附上 对于or与and运算 其一, 在不加括号时候, and优先级大于or 其二, x or y 的值只可能是x或y. x为真就是x, x为假就是y 第三, x and y 的值只可能是x或y. x为 ...