题目描述

JudgeOnline/upload/201710/55.doc

输入

第一行是两个整数A与B(1≤A,B≤10),中间用空格分隔,表示该迷宫是A行B列的。
第2行至第A+1行,每行有B个1至100以内的整数,表示该迷宫每一格的危险程度。
以下一行是一个整数K。接着K行每行有四个整数X0,Y0,X1,Y1,
(1 ≤X0,X1≤A, 1≤Y0,Y1≤B) ,(X0,Y0),(X1,Y1)为相邻的两格,这两格相通。
接着一行是一个整数N(0≤N≤A*B/2),表示有N个出口与入口。
以下N行,每行有两个整数X0,Y0,表示每个入口的行列位置。
以下还有N行,每行有两个整数X1,Y1,表示每个出口的行列位置。

输出

输出仅一个数,若队员们不能全部到达指定目标位置,则输出-1;
否则输出所有队员所经过的所有单元格的危险程度之和。

样例输入

3 4
20 30 40 30
30 60 20 20
20 15 20 20
13
1 1 2 1
1 2 1 3
1 2 2 2
1 3 1 4
1 4 2 4
2 1 2 2
2 1 3 1
2 2 2 3
2 3 2 4
2 4 3 4
3 1 3 2
3 2 3 3
3 3 3 4
2
1 1
1 2
2 3
3 4

样例输出

235


题解

费用流

这题意真的不知道怎么概括了。。。

A、B只有10,一眼网络流;再想一下就很容易想出费用流建模。

建图方法:

把每个点拆成入点和出点两个,中间连边,容量为1,费用为对应代价;

对于相邻的点x、y,从x的出点向y的入点、从y的出点向x的入点连边,容量为1,费用为0;

对于起点,源点向其连边,容量为1,费用为0;对于终点,其向汇点连边,容量为1,费用为0。

跑费用流,如果满流则说明有解,输出费用;否则无解。

切掉0AC并拿下rank1真开心 (*^▽^*)

#include <queue>
#include <cstdio>
#include <cstring>
#define N 300
#define M 10000
#define pos(i , j , k) (k * n * m + (i - 1) * m + j)
using namespace std;
queue<int> q;
int head[N] , to[M] , val[M] , cost[M] , next[M] , cnt = 1 , s , t , dis[N] , from[N] , pre[N];
inline void add(int x , int y , int v , int c)
{
to[++cnt] = y , val[cnt] = v , cost[cnt] = c , next[cnt] = head[x] , head[x] = cnt;
to[++cnt] = x , val[cnt] = 0 , cost[cnt] = -c , next[cnt] = head[y] , head[y] = cnt;
}
bool spfa()
{
int x , i;
memset(from , -1 , sizeof(from));
memset(dis , 0x3f , sizeof(dis));
dis[s] = 0 , q.push(s);
while(!q.empty())
{
x = q.front() , q.pop();
for(i = head[x] ; i ; i = next[i])
if(val[i] && dis[to[i]] > dis[x] + cost[i])
dis[to[i]] = dis[x] + cost[i] , from[to[i]] = x , pre[to[i]] = i , q.push(to[i]);
}
return ~from[t];
}
int main()
{
int n , m , k , p , i , j , a , b , c , d , flow = 0 , ans = 0;
scanf("%d%d" , &n , &m) , s = 0 , t = n * m * 2 + 1;
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= m ; j ++ )
scanf("%d" , &a) , add(pos(i , j , 0) , pos(i , j , 1) , 1 , a);
scanf("%d" , &k);
for(i = 1 ; i <= k ; i ++ ) scanf("%d%d%d%d" , &a , &b , &c , &d) , add(pos(a , b , 1) , pos(c , d , 0) , 1 , 0) , add(pos(c , d , 1) , pos(a , b , 0) , 1 , 0);
scanf("%d" , &p);
for(i = 1 ; i <= p ; i ++ ) scanf("%d%d" , &a , &b) , add(s , pos(a , b , 0) , 1 , 0);
for(i = 1 ; i <= p ; i ++ ) scanf("%d%d" , &a , &b) , add(pos(a , b , 1) , t , 1 , 0);
while(spfa())
{
flow ++ , ans += dis[t];
for(i = t ; i != s ; i = from[i]) val[pre[i]] -- , val[pre[i] ^ 1] ++ ;
}
if(flow < p) puts("-1");
else printf("%d\n" , ans);
return 0;
}

【bzoj5070】危险的迷宫 费用流的更多相关文章

  1. 【BZOJ5070】危险的迷宫 最小费用最大流

    [BZOJ5070]危险的迷宫 Description JudgeOnline/upload/201710/55.doc Input 第一行是两个整数A与B(1≤A,B≤10),中间用空格分隔,表示该 ...

  2. ACdream 1128 Maze(费用流)

    题目链接:http://acdream.info/problem?pid=1128 Problem Description wuyiqi陷入了一个迷宫中,这个迷宫是由N*M个格子组成的矩阵.每个格子上 ...

  3. 【 UVALive - 5095】Transportation(费用流)

    Description There are N cities, and M directed roads connecting them. Now you want to transport K un ...

  4. 【思维题 费用流 技巧】bzoj5403: marshland

    主要还是网络流拆点建图一类技巧吧 Description JudgeOnline/upload/201806/1(4).pdf 题目分析 第一眼看到这题时候只会把每个点拆成4个方向:再强制定向连边防止 ...

  5. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  6. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  7. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  8. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

  9. Codeforces 730I [费用流]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...

随机推荐

  1. EF core 中用lambda表达式和Linq的一些区别

    转眼一看,又过了10几天没有写博客了,主要还是没有什么可以写的,因为遇到的问题都不是很有价值.不过最近发现用lambda表达式,比用Linq的代码量会少一些,而且也方便一些.不过两者都差不多,相差不是 ...

  2. oracle-sql优化-通过分组和缓存减少不必要的读

    环境:aix 7.1,oracle12.1.0.2 cdb 优化前SQL select * from (select row_.*, rownum rownum_ from (select '弱覆盖' ...

  3. raid概述与CentOS7.4中raid5的搭建与测试

    前言 一.raid的定义与作用 raid(独立冗余磁盘阵列).raid技术通过把多个硬盘设备组合成一个容量更大的,安全性更好的磁盘阵列.把数据切割成许多区段后分别放在不同的物理磁盘上,然后利用分散读写 ...

  4. centos7编译安装Apache

    一.安装 安装之前先将服务器的防火墙关掉. systemctl  stop  firewalld systemctl  disable  firewall 第一步: 安装apr 下载: wget -c ...

  5. vuex组件 vuex-persistedstate

    vuex用于管理项目中的全局状态,但是我们一刷新vuex中保存的全局状态就会被全部初始化,虽然我们也可以同事缓存到storage中做两步操作,但是vuex-persistedstate组件已经帮我们完 ...

  6. 在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)

    在Pycharm中导入第三方模块库 一.打开pycharm: 二.点击菜单上的“file” -> “setting”: 三.步骤二完成后出现界面如下所示.选中你的项目(比如thisyan Pro ...

  7. pyecharts数据分析及展示

    仅仅从网上爬下数据当然是不够用的,主要还得对数据进行分析与展示,大部分人都看重薪资,但是薪资数据有的是*k/月,有的是*万/月,还有*万/年等等,就要对数据进行清理 将所有单位统一化,全部换算成统一单 ...

  8. linux下磁盘分区、格式化、挂载

    (1)fdisk /dev/sdb进行分区 (2)选择n表示添加一个分区,选择d表示删除一个分区.可通过m获取帮助信息 (3)选择p表示主分区,然后输入分区大小 (4)分区完成后,可通过fdisk - ...

  9. stm32+lwip(五):以太网帧发送测试

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

  10. 在WPF中自定义控件(2) UserControl

    原文:在WPF中自定义控件(2) UserControl 在WPF中自定义控件(2) UserControl                                               ...