题目背景

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. linux中硬链接与软链接

    硬链接记录的是目标的inode,软链接记录的是目标的路径. 软链接就像快捷方式,而软链接就像备份.软链接能够做跨分区的链接,而硬链接因为inode的缘故,仅仅能在本分区中做链接,所以软链接使用很多其它 ...

  2. This version of the rendering library is more recent than your version of IntelliJ IDEA.

    今天往idea里导入其它项目时又遇到了一个问题.单独标记一下. 导入后打开一个布局xml文件,发现不能渲染,报错为: This version of the rendering library is ...

  3. Java并发编程实践读书笔记(1)线程安全性和对象的共享

    2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...

  4. jQuery:deferred [转]

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

  5. VM环境下Linux虚拟机扩展存储空间操作方法总结

    用VMwareware虚拟机安装的 Linux 系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置. 一.空间扩展  (1)打开VMware,选择Edi ...

  6. Linux:如何进行c++编程

    不适应美帝的饮食,当一只咸鱼在apartment里Coding一波,学习学习如何在Ubuntu实现C++的编程 正文如下: (预备知识) 学习Vim:  http://www.cnblogs.com/ ...

  7. node作为客户端请求第三方

    var http = require('http'); let util = require('util'); http.get('http://www.imooc.com/u/card',funct ...

  8. JAVA多线程统计日志计数时的线程安全及效率问题

    最近工作上遇到一个需求:需要根据nginx日志去统计每个域名的qps(Query Per Second,每秒查询率)数据. 解决了日志读取等问题之后,为了写一个尽可能高效的统计模块,我决定用多线程去计 ...

  9. java二维码生成代码

    QRCodeUtil.encode(text, "D:/004.jpg", "D:", true, "exp");// 这个方法的第一个参数 ...

  10. Pipeline in scala——给scala添加管道操作

     linux系统中管道这一功能相信大家肯定使用过,比如现在想找到用户目录下文件名包含db的所有文件,ls ~的结果,作为grep db的参数: ➜ ~ ls ~ | grep db kv.mv.db ...