链接:https://www.nowcoder.com/acm/contest/69/D
来源:牛客网

题目描述

这是一个关于二维格子状迷宫的题目。迷宫的大小为N*M,左上角格子座标为(1,1)、右上角格子座标为(1,M)、左下角格子座标为(N,1)、右下角格子座标为(N,M)。每一格都用-1到109之间的整数表示,意义分别为:-1为墙壁,0为走道,而1到109之间的正整数代表特殊的走道。
蜥蜴最初位于迷宫的座标(1,1)的格子,每一步蜥蜴只能往上、下、左、右、左上、右上、左下、右下八个方向之一前进一格,并且,他也不能走出迷宫边界。蜥蜴的目的地是走到迷宫的右下角格子,也就是座标位置(N,M)。我们想要动一些手脚,使得蜥蜴没有办法从(1,1)出发并抵达(N,M)。我们学会了一个邪恶的法术,这个法术可以把特殊的走道变成墙壁,施法一次的代价为表示该特殊走道的正整数。
假设,我们可以在蜥蜴出发之前不限次数的使用这个邪恶的法术,所花的总代价即为每次施法代价的总和,蜥蜴出发之后就不能再使用这个法术了,请问让蜥蜴没办法达到终点所必须花费的最小总代价是多少呢?
注意,0所代表的走道是无法变为墙壁的。

输入描述:

输入的第一行有三个正整数Q,N,M。
代表接下来有Q组数据,这Q组数据都是N*M的迷宫。
接下来每组数据各N行,代表一个迷宫,每行各M个整数,第i行中的第j个整数代表迷宫座标(i,j)的格子。

输出描述:

每一组数据输出一行,如果无论如何蜥蜴都能到达终点,请在这一行中输出-1,否则请在这一行中输出一个代表答案的整数。

对于样例1,建图方式如下:

对于-1的点(原本就是墙),你可以把它当成代价为0的特殊的走道

求出S到T的最短路就是答案,如果S和T不连通,说明你不可能封住蜥蜴的路

为什么这样求出来的最短路就是答案呢?

考虑网络流:起点(1, 1)当成源点,终点(n, m)当成汇点,每条特殊的走道都相当于一条流量为消耗的边,每条普通的走道都相当于一条流量inf的边

很容易想到答案就是图中的最小割,而平面图的最小割是可以转成对偶图最短路的,这样就搞定了!因为这显然是一张平面图,而且很好建边

#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
typedef struct
{int y;int val;
}Res;
Res now;
queue<int> q;
vector<Res> G[250005];
int n, m, a[505][505];
LL dp[250005];
int Poi(int x, int y)
{return (x-1)*m+y;
}
int main(void)
{int Tc, i, j, S, T, x, y;scanf("%d%d%d", &Tc, &n, &m);while(Tc--){for(i=0;i<=n+1;i++){for(j=0;j<=m+1;j++)a[i][j] = -1;}for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d", &a[i][j]);if(a[i][j]==-1)  a[i][j] = 0;else if(a[i][j]==0)  a[i][j] = -1;}}for(i=0;i<=n*m+1;i++){G[i].clear();dp[i] = (LL)1000000000*250005;}S = 0, T = n*m+1;for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(a[i][j]==-1)continue;if(a[i-1][j]!=-1){now.val = a[i-1][j];now.y = Poi(i-1, j);G[Poi(i, j)].push_back(now);now.y = Poi(i, j);now.val = a[i][j];G[Poi(i-1, j)].push_back(now);}if(a[i][j+1]!=-1){now.val = a[i][j+1];now.y = Poi(i, j+1);G[Poi(i, j)].push_back(now);now.val = a[i][j];now.y = Poi(i, j);G[Poi(i, j+1)].push_back(now);}if(i==n || j==1){now.val = a[i][j];now.y = Poi(i, j);G[S].push_back(now);}if(i==1 || j==m){now.val = 0;now.y = T;G[Poi(i, j)].push_back(now);}}}dp[S] = 0;q.push(S);while(q.empty()==0){x = q.front();q.pop();for(i=0;i<G[x].size();i++){y = G[x][i].y;if(dp[x]+G[x][i].val<dp[y]){dp[y] = dp[x]+G[x][i].val;q.push(y);}}}if(dp[T]>=(LL)1000000000*250005)printf("-1\n");elseprintf("%lld\n", dp[T]);}return 0;
}
/*
1251 3 3
1000 1 1
1000 1 10000
1 1 100000
*/

Wannafly交流赛1: D. 迷宫2(最短路)相关推荐

  1. Wannafly交流赛1 _A_有理数 【水】

    Wannafly交流赛1 A有理数 [水] 链接:https://www.nowcoder.com/acm/contest/69/A 来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到 ...

  2. Wannafly交流赛1_B_硬币【数学】

    Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...

  3. Wannafly交流赛1 B 硬币[数学思维/贪心]

    链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 蜥蜴的生日快到了,就在这个月底! 今年,蜥蜴的快乐伙伴之一壁虎想要送好多个1元硬币来恶整蜥蜴. ...

  4. Wannafly交流赛1: B. 白兔的式子(组合数)

    链接:https://www.nowcoder.com/acm/contest/73/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  5. Wannafly交流赛1: D. 白兔的字符串(随机+EXKMP)

    链接:https://www.nowcoder.com/acm/contest/73/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. Wannafly交流赛1: C. 腰带图(瞎搞)

    链接:https://www.nowcoder.com/acm/contest/69/C 来源:牛客网 题目描述 一个n个点m条边的无向图,它若满足以下性质,我们就称它为腰带图: 1.n为>=6 ...

  7. Wannafly交流赛1B 硬币 ( 数学

    B 硬币 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥蜴的快乐伙伴之一壁虎想要送好多个1元硬币来恶整蜥蜴. 壁虎身上目前有的硬币种类和数量如下: c1个1元硬币.c5个5元硬币.c10个10元 ...

  8. Wannafly交流赛1 B硬币

    链接: https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  9. Wannafly交流赛1 B-硬币

    链接: https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥蜴的快乐伙伴之一壁虎想要送好多个1元硬币来 ...

最新文章

  1. Linux下不使用qt自带sleep,Linux下Qt多线程编程
  2. 自动化监控--zabbix中的用户和用户组详解
  3. Centos7KVM的安装与配置及创建虚拟机
  4. 《Java多线程编程核心技术》读后感(十五)
  5. python rs232_使用Python進行RS-232通信返回垃圾信息
  6. php 后退 触发事件,php – 后退按钮的会话问题
  7. linux ipv4 keepalive,Linux中keepalive的使用
  8. 免费盈利模式是骗人的吗?
  9. python的多行语句可以使用反斜杠_Python的续行符:反斜杠\
  10. 开源人脸106关键点
  11. logback自定义日志配置
  12. 《诗经·王风·黍离》
  13. adb shell input keyevent 模拟按键事件
  14. 【元胞自动机】元胞自动机多车道信号交叉口仿真【含Matlab源码 818期】
  15. 氢os关闭android键盘,氢OS11到来前,先听听这些一加用户对氢OS的吐槽
  16. 矿业工程毕业论文题目
  17. IBM将自愿离职变常态 柳传志教你优雅回应裁员
  18. 关闭睿频提升续航静音运行
  19. 红米3 android 版本,四型号五版本分不清?红米3各大版本详细解读
  20. 220216HTML学习日记

热门文章

  1. python怎么读取csv文件-python读写csv文件方法详细总结
  2. 零基础学python大概要多久-零基础自学python要多久?
  3. python读音-Python怎么读
  4. linux printf 底层api,printf · Linux C API 参考手册 · 看云
  5. 怎么用鼠标选中java中table的某一行_为什么同事的工作效率那么高?学会这些鼠标双击技巧,你也可以的...
  6. linux如何重置网络,Ubuntu 重新设置网络
  7. 编辑画面,element-ui的单选框组选中值以及画面选择样式无法切换,但是绑定的v-model值已发生变化
  8. [Vue warn]: Error in render: TypeError: _self.$scopedSlots.default is not a function 错误解决
  9. FFMPEG结构体分析:AVFrame
  10. 给 VS2008 / VS2010 MFC 项目添加启动画面