题目传送门

电路维修

题目背景

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

说明

样例的输入对应于题目描述中的情况。

只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。


  分析:

  一开始看到这题还是被吓了一下,一堆斜杠什么的真的头疼。。

  但是如果转换一下思维就很容易了,我们把格子中的每一个交点作为图的节点,电路就是边,那么不难想到,一个格子周围有四个点,一条电路会联通其中两个,另外两个如果需要联通就需要转一次。那么就可以把这条信息转化为边权,建图然后跑最短路就行了。

  蒟蒻不会堆优化的Dijkstra,就索性打了个spfa然后开O2强行A了23333。得去补一下堆优化Dijkstra了。。。

  Code:

//It is made by HolseLee on 7th Aug 2018
//Luogu.org P2243
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
using namespace std; const int N=;
const int inf=2e9+;
int n,m,T,dis[N*N],head[N*N],size;
char ch[N];
bool vis[N*N];
struct Node{
int to,next,val;
}edge[(N*N)<<];
queue<int>team; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline void add(int x,int y,int z)
{
edge[++size].to=y;
edge[size].val=z;
edge[size].next=head[x];
head[x]=size;
} void spfa()
{
while(!team.empty())team.pop();
memset(vis,false,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
team.push();
vis[]=true;dis[]=;
int x,y;
while(!team.empty()){
x=team.front();team.pop();
vis[x]=false;
for(int i=head[x];i!=-;i=edge[i].next){
y=edge[i].to;
if(dis[y]>dis[x]+edge[i].val){
dis[y]=dis[x]+edge[i].val;
if(!vis[y])team.push(y),vis[y]=true;
}
}
}
} int main()
{
T=read();
while(T--){
n=read();m=read();
size=;
memset(head,-,sizeof(head));
int lu,ru,ld,rd;
for(int i=;i<=n;++i){
scanf("%s",ch+);
for(int j=;j<=m;++j){
lu=((i-)*(m+)+j);
ru=((i-)*(m+)+j+);
ld=(i*(m+)+j);
rd=(i*(m+)+j+);
if(ch[j]=='/'){
add(lu,rd,);
add(rd,lu,);
add(ld,ru,);
add(ru,ld,);
}
else {
add(lu,rd,);
add(rd,lu,);
add(ld,ru,);
add(ru,ld,);
}
}
}
spfa();
if(dis[(n+)*(m+)]>inf)
printf("NO SOLUTION\n");
else
printf("%d\n",dis[(n+)*(m+)]);
}
return ;
}

洛谷P2243 电路维修 [最短路]的更多相关文章

  1. 洛谷 P2243 电路维修

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

  2. 【Dijkstra堆优化】洛谷P2243电路维修

    题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...

  3. 洛谷P2243 电路维修

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

  4. 洛谷P2242 公路维修问题

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

  5. P2243 电路维修

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

  6. 洛谷P1491 集合位置 [最短路,SPFA]

    题目传送门 题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记 ...

  7. Luogu P2243 电路维修 双端队列BFS

    当转移的代价是0和一个分明不同的权值时,可以用双端队列BFS去跑(你跑最短路也没问题..QWQ) 而对于这道题,边旋转代价是1,不旋转代价是0:可以直接建图最短路,也可以跑BFS 这个题建图很有意思: ...

  8. 洛谷P1613 跑路(最短路+倍增)

    P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...

  9. 洛谷 P2242 公路维修问题

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

随机推荐

  1. Tensorboard教程:显示计算图中节点信息

    Tensorboard显示计算图节点信息 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1 ...

  2. Tensorflow实现学习率衰减

    Tensorflow实现学习率衰减 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Deeplearning AI Andrew Ng Tensorflow1.2 API 学习率衰减 ...

  3. dva 笔记

    最简单的结构 // 创建应用 const app = dva(); // 注册 Model app.model({ namespace: 'count', state: 0, reducers: { ...

  4. Spring整合JMS(二)——三种消息监听器(转)

    *注:别人那复制来的 1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageList ...

  5. Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信

    --交换机配置 --交换机和路由器连接的接口 switchport mode trunk --路由器配置 enable conf t int fa0/0.1 --路由器接口的子接口 encapsula ...

  6. Keras学习笔记1--基本入门

    """ 1.30s上手keras """ #keras的核心数据结构是“模型”,模型是一种组织网络层的方式,keras 的主要模型是Sequ ...

  7. 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  8. 用js拼接url为pathinfo模式

    用js拼接url为pathinfo模式

  9. 牛奶ddw如何通过以太坊钱包实现互相打赏

    很多朋友不清楚如何转账ddw,但是万能的网友是无敌的,这两天就自己摸索的一点经验总结下今天的转账经验. 1. 提取到自己的账户 这个大家都知道如何操作,使用官方的钱包 在“日日盈app”中点击&quo ...

  10. 使用angluar-cli的ng g component home指令出现的错误

    Error: ELOOP: too many symbolic links encountered, stat '/Users/zzy/angular/taskmgr/node_modules/@an ...