题目背景

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. hdu 5305 friends

    每一次比赛的时候脑子都卡顿, 这次更离谱,我居然二进制枚举边,这么大的复杂度.而且剪不了枝 后来学长说着是道爆搜.搜每一条边.恍然大悟. 仅仅须要剪掉点的度数是奇数的时候,或者他的线上朋友或线下朋友大 ...

  2. 【转载】Java 类加载与初始化

    原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在J ...

  3. android 程序执行linux命令注意事项

    一:问题描述    在已经root过的android设备下,app执行一个linux命令,app需要获取su权限,在某些android主板下会出现异常, Command: [su] Working D ...

  4. git更新失败Probably the path to Git executable is not valid

    git更新代码失败 检查setting配置,发现路径配置错误 找对git的安装目录,修改路径后保存即可

  5. Python 项目实践一(外星人入侵小游戏)第五篇

    接着上节的继续学习,在本章中,我们将结束游戏<外星人入侵>的开发.我们将添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏.我们还将修改这个游戏,使其在玩家的等级提高时加快 ...

  6. 《算法 (第4版)》【PDF】下载

    <算法 (第4版)>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196349 (第4版)>[PDF]"  TITL ...

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

  8. C:数据结构与算法之单链表

    单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结 ...

  9. StringUtils工具类常用方法

    前言:工作中看到项目组里的大牛写代码大量的用到了StringUtils工具类来做字符串的操作,便学习整理了一下,方便查阅. isEmpty(String str) 是否为空,空格字符为false is ...

  10. xamarin android如何监听单击事件

    在xamarin android单击事件是最基础的事情,看过菜鸟上的android教程时,java写的都是监听事件,为一个按钮,单选按钮.多选按钮的单击事件有三种,前面两种用的非常普遍,也很简易,我这 ...