题目背景

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:

1
3 5
\\/\\
\\///
/\\\\
输出样例#1:

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电路维修的更多相关文章

  1. 洛谷 P2243 电路维修

    P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...

  2. 洛谷P2243 电路维修 [最短路]

    题目传送门 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...

  3. 洛谷P2243 电路维修

    题目地址 转化为图论问题 对于每个交叉点(X,Y)抽象成节点.与它相邻的四个点中,可以直接连线的边权为0,否则边权为1. 用死了的SPFA解决图论问题. #include <cstring> ...

  4. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  5. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  6. 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 ...

  7. 洛谷P2242 公路维修问题

    To 洛谷.2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且 ...

  8. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. P2243 电路维修

    P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...

随机推荐

  1. oracle实现主键自增

    首先,创建一张表: CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25)); 然后,自定义一个序列(seq ...

  2. 观未见,行不止 —— Power BI 两周年技术和方案交流圆桌会议纪实

    作者:陈希章 发表于 2017年8月13日 2017年8月11日下午两点,Power BI 两周年技术和方案交流圆桌会议如期举行.线上和线下约有100位朋友参加了由我组织和主持的本次活动,在两个小时的 ...

  3. MyBatis_多查询条件问题

    一.多查询条件无法整体接收问题的解决 在实际工作中,表单中所给出的查询条件有时是无法将其封装成一个对象,即查询方法只能携带多个参数,而不能携带将这多个参数进行封装的一个对象.对于这个问题,有两种解决方 ...

  4. 《设计模式:可复用面向对象软件的基础》【PDF】下载

    <设计模式:可复用面向对象软件的基础>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382288 内容介绍 <设计模式:可复 ...

  5. iOS OC环信实时语音切换听筒免提听不到声音报错:AVAudioSessionErrorCodeBadParam

    出现这个报错:AVAudioSessionErrorCodeBadParam 先看看你的问题是不是在切换听筒免提的时候 听不到声音了, 不是的可以继续搜索去了   问题在这里 把圈住的那个货换成这个就 ...

  6. APP闪退问题

    1.iOS-中app启动闪退的原因 2.iOS开发-闪退问题-解决之前上架的 App 在 iOS 9 会闪退问题 3.iOS-应用闪退总结 4.iOS开发-捕获程序崩溃日志 5.iOS开发-应用崩溃日 ...

  7. touchstart和touchend事件

    touchstart和touchend事件 移动互联网是未来的发展趋势,现在国内很多互联网大佬都在争取移动这一块大饼,如微信及支付宝是目前比较成功的例子,当然还有各种APP和web运用. 由于公司的需 ...

  8. Java 向下转型

    1.Java 中父类直接向子类转型的不合法的,可以编译但运行时报错. Java中子类直接向父类转型 是合法的,但转型后,可以执行的方法仅限存在于父类中的,在执行时,先看子类的是否有定义,有就执行,没有 ...

  9. Selenide UI 自动化测试

       我没有拼写错误,确实不是 Selenium ,但是,只要是 Web UI 自动化测试框架,基本上都是基于Selenium 的.Selenide 也不例外.那为啥不直接用Selenium呢? 因为 ...

  10. python爬虫爬取人人车(二手车)、利用padas、matplotlib生成图表,将信息打成csv格式

    该程序主要为了抓取人人车卖车信息,包括车系.车型号.购车日期.卖车价格.行驶路程.首付价格等等信息.话不多说直接代码. 入库之后将Mongodb里的信息导出成Excel语句 mongoexport - ...