题目背景

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. UVA 12009 - Avaricious Maryanna(数论)

    UVA 12009 - Avaricious Maryanna 题目链接 题意:给定一个n.求出n个数位组成的数字x,x^2的前面|x|位为x 思路:自己先暴力打了前几组数据,发现除了1中有0和1以外 ...

  2. 腾讯qq等级计算公式面试题

    就三道题大概是: 1. 推算出等级相应的天数 这个还比較简单,公式是:(b=2a+3)   a是等级, b是相应的天数 2. 推算出等级总共的天数 先看下规律 等级a 相应天数b 总天数s 1 5 5 ...

  3. HDU 4960 Another OCD Patient(记忆化搜索)

    HDU 4960 Another OCD Patient pid=4960" target="_blank" style="">题目链接 记忆化 ...

  4. python3.5新增函数isclose的使用

    前言:python3.5的math模块新增一个isclose函数用来判断两个浮点数的值是否接近或相等,这是由于浮点数的计算总是存在一定的误差.下面谈一下用法: import math print(ma ...

  5. idea将maven项目打包成war包的方式,以及使用war包

    打包WAR过程 首先对项目进行编译.然后执行以下步骤: 单击下图红色方框处  在IDEA右侧出现maven project选项  单击maven project选项,出现Spring MVC Basi ...

  6. 项目(1)----用户信息管理系统(4)---(struts开发)

    项目开发---实现注册功能 接下就要用到Struts框架了,再用之前先配置好有关操作 1.在web.xml设置前端配置器 2.在src下新建struts.xml 3.写好首页jsp: 4.配置好str ...

  7. javascript中的双向绑定

    阅读目录 一:发布订阅模式实现数据双向绑定 二:使用Object.defineProperty 来实现简单的双向绑定. 前言: 双向数据绑定的含义:可以将对象的属性绑定到UI,具体的说,我们有一个对象 ...

  8. python_web----------数据可视化从0到1的过程

    一.数据可视化项目配置 1. django + Echarts 2. 服务器(linux:Ubuntu 17.04 (GNU/Linux 4.10.0-40-generic x86_64)) 3. I ...

  9. 【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>

    package 对象比较排序; import java.util.Arrays; class A implements Comparable<A>{ private String name ...

  10. iOS 中Block以及Blocks的使用,闭包方法调用

    OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...