【bzoj2346】[Baltic 2011]Lamp 堆优化Dijkstra
2017-07-11 09:39
323 查看
题目描述
2255是一个傻X,他连自己家灯不亮了都不知道。
某天TZ大神路过他家,发现了这一情况,
于是TZ开始行侠仗义了。
TZ发现是电路板的问题,
他打开了电路板,发现线路根本没有连上!!
于是他强大的脑力可以使某个格子上的线路从\变为/,
或者从/变为\。
2255不会电路(因为他什么都不会),但是他想知道TZ最少要用多少次脑力才能使他家的灯变亮。
如果无法变亮,输出“NO SOLUTION”。
n,m<=500
![](http://www.lydsy.com/JudgeOnline/upload/201106/a.jpg)
样例输入
3 5
\\/\\
\\///
/\\\\
样例输出
1
题解
堆优化Dijkstra,刷水有益于健康
如果有解,那么若经过某条线,它的方向一定是确定的。也就是说一条线的“/”方向和“\”方向互不影响。
所以我们可以分别加这两种边,边权为是否需要改变方向,然后跑堆优化Dijkstra即可。
数组大小已实测。
2255是一个傻X,他连自己家灯不亮了都不知道。
某天TZ大神路过他家,发现了这一情况,
于是TZ开始行侠仗义了。
TZ发现是电路板的问题,
他打开了电路板,发现线路根本没有连上!!
于是他强大的脑力可以使某个格子上的线路从\变为/,
或者从/变为\。
2255不会电路(因为他什么都不会),但是他想知道TZ最少要用多少次脑力才能使他家的灯变亮。
如果无法变亮,输出“NO SOLUTION”。
n,m<=500
![](http://www.lydsy.com/JudgeOnline/upload/201106/a.jpg)
样例输入
3 5
\\/\\
\\///
/\\\\
样例输出
1
题解
堆优化Dijkstra,刷水有益于健康
如果有解,那么若经过某条线,它的方向一定是确定的。也就是说一条线的“/”方向和“\”方向互不影响。
所以我们可以分别加这两种边,边权为是否需要改变方向,然后跑堆优化Dijkstra即可。
数组大小已实测。
#include <cstdio> #include <cstring> #include <queue> #include <utility> #define N 300010 #define pos(i , j) ((i) * (m + 1) + j + 1) using namespace std; typedef pair<int , int> pr; priority_queue<pr> q; int head , to[N << 2] , len[N << 2] , next[N << 2] , cnt , dis , vis ; char str[510]; void add(int x , int y , int z) { to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt; to[++cnt] = x , len[cnt] = z , next[cnt] = head[y] , head[y] = cnt; } int main() { int n , m , i , j , x; scanf("%d%d" , &n , &m); for(i = 1 ; i <= n ; i ++ ) { scanf("%s" , str + 1); for(j = 1 ; j <= m ; j ++ ) add(pos(i - 1 , j - 1) , pos(i , j) , str[j] == '/') , add(pos(i , j - 1) , pos(i - 1 , j) , str[j] == '\\'); } memset(dis , 0x3f , sizeof(dis)) , dis[1] = 0 , q.push(pr(0 , 1)); while(!q.empty()) { x = q.top().second , q.pop(); if(vis[x]) continue; vis[x] = 1; for(i = head[x] ; i ; i = next[i]) if(dis[to[i]] > dis[x] + len[i]) dis[to[i]] = dis[x] + len[i] , q.push(pr(-dis[to[i]] , to[i])); } if(dis[pos(n , m)] == 0x3f3f3f3f) puts("NO SOLUTION"); else printf("%d\n" , dis[pos(n , m)]); return 0; }
相关文章推荐
- Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆
- 【BZOJ】【P2346】【Baltic 2011】【Lamp】【题解】【堆Dijkstra】
- BZOJ2346 : [Baltic 2011]Lamp
- 2346: [Baltic 2011]Lamp (SPFA+SLF优化)
- BZOJ2346 [Baltic 2011]Lamp
- bzoj 2346: [Baltic 2011]Lamp spfa
- bzoj2346 [Baltic 2011]Lamp(建图spfa)
- BZOJ[3073][Pa2011]Journeys 线段树优化建图+Dijkstra堆优化
- BZOJ 2346 Baltic 2011 Lamp SPFA
- 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra
- BZOJ 2346 [Baltic 2011]Lamp dijkstra堆优化
- 【BZOJ3963】【ACM-WF2011】MachineWorks(CDQ分治+斜率优化)
- bzoj2216: [Poi2011]Lightning Conductor(分治决策单调性优化)
- BZOJ 2069 POI2004 ZAW 堆优化Dijkstra
- 【BZOJ 2216】【POI 2011】[动态规划][决策点单调优化]Lightning Conductor
- bzoj1576[Usaco2009 Jan]安全路径Travel(堆优化dijkstra+并查集)
- [BZOJ3963][WF2011][CDQ分治][斜率优化][DP]MachineWorks
- BZOJ 2442 [Usaco2011 Open]修剪草坪 DP+单调队列优化
- BZOJ2553 [BeiJing2011]禁忌 【AC自动机 + dp + 矩乘优化】
- BZOJ2348 [Baltic 2011]Plagiarism