题目链接

题意

给出一个n*m的酒店,每个点是一个房间,要将这个酒店的房间划分成为两块(一块无烟区,一块吸烟区),相邻的两个房间之间有一条带权边,权值代表空气锁的面积,如果把这条边给去掉,那么需要花费(空气锁的面积+开一个窗口传食物)*1000元。问需要的最少花费是多少。要注意如果面积为0,则这条边不能划分

思路

全场做的人不多,主要看题意比较难,看懂题意就会发现是裸的最小割,但是有个面积为0的坑点。这里的边需要开的比较大,考虑到每次增加两个点,就会使边增加三条(不知道这样想对不对),于是就开两倍(还有两倍双向边)。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int M = 1e3 + 11;
const int N = 1e6 + 11;
struct Edge {int u, v, nxt, cap;
} edge[N*4];
int head[N], tot, id[M][M];
int cur[N], gap[N], dis[N], pre[N];
queue<int> que;void Add(int u, int v, int cap) {edge[tot] = (Edge) { u, v, head[u], cap }; head[u] = tot++;edge[tot] = (Edge) { v, u, head[v], cap }; head[v] = tot++;
}void BFS(int T) {while(!que.empty()) que.pop();memset(dis, INF, sizeof(dis));memset(gap, 0, sizeof(gap));gap[0] = 1; dis[T] = 0;que.push(T);while(!que.empty()) {int u = que.front(); que.pop();for(int i = head[u]; ~i; i = edge[i].nxt) {int v = edge[i].v;if(dis[v] != INF) continue;dis[v] = dis[u] + 1;gap[dis[v]]++;que.push(v);}}
}int ISAP(int S, int T, int n) {BFS(T);memcpy(cur, head, sizeof(cur));int i, flow, u = pre[S] = S, index, ans = 0;while(dis[S] < n) {if(u == T) {flow = INF, index = u;for(u = S; u != T; u = edge[cur[u]].v)if(edge[cur[u]].cap < flow) flow = edge[cur[u]].cap, index = u;for(u = S; u != T; u = edge[cur[u]].v)edge[cur[u]].cap -= flow, edge[cur[u]^1].cap += flow;u = index, ans += flow;}for(i = cur[u]; ~i; i = edge[i].nxt)if(dis[edge[i].v] == dis[u] - 1 && edge[i].cap) break;if(~i) {pre[edge[i].v] = u; cur[u] = i; u = edge[i].v;} else {if(--gap[dis[u]] == 0) break;int md = n + 1;for(i = head[u]; ~i; i = edge[i].nxt)if(edge[i].cap && dis[edge[i].v] < md) md = dis[edge[i].v], cur[u] = i;gap[dis[u] = md + 1]++;u = pre[u];}} return ans;
}int main() {int t; scanf("%d", &t);while(t--) {memset(head, -1, sizeof(head));tot = 0;int n, m, sx, sy, ex, ey;scanf("%d%d", &n, &m);scanf("%d%d%d%d", &sx, &sy, &ex, &ey);int cnt = 0;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++) id[i][j] = ++cnt;for(int i = 0; i < n; i++) {for(int j = 0; j < m - 1; j++) {int cap; scanf("%d", &cap);if(cap) Add(id[i][j], id[i][j+1], cap + 1);}}for(int i = 0; i < n - 1; i++) {for(int j = 0; j < m; j++) {int cap; scanf("%d", &cap);if(cap) Add(id[i][j], id[i+1][j], cap + 1);}}printf("%d\n", ISAP(id[sx][sy], id[ex][ey], n * m) * 1000);} return 0;
}

转载于:https://www.cnblogs.com/fightfordream/p/7636624.html

Codeforces Gym101518H:No Smoking, Please(最小割)相关推荐

  1. codeforces gym-101736 Dessert First Strategy 最小割

    题目 题目链接 题解 很典型的最小割模型问题,我们知道颜色不确定的点最终要么是白色,要么是黑色,是两种对立的状态,我们联想到了最小割. 最小割是割掉权值和最小的边集,使得图中的点分成两个点集,一个包含 ...

  2. CodeForces 1517G Starry Night Camping(网络流最小割)

    CodeForces 1517G Starry Night Camping problem 洛谷链接 solution 这个平行四边形的脑洞我™真的长见识了 本题最离谱的要求就是:平行四边形的一条边平 ...

  3. Codeforces Educational Round#21 F(808F) Solution:网络流(最小割)

    题意:给出一组卡牌(100张),卡牌有三个属性值:power,c,level,其中c和level是用来限制的,power是目标值. 具体的限制规则是:只有level小于等于玩家的playerlevel ...

  4. Forethought Future Cup - Elimination Round G. Zoning Restrictions 最大流(最小割)

    题目链接: https://codeforces.com/contest/1146/problem/G 题意: 你现在要给 nnn 个位置制定高度 hi(1<=hi<=H)h_i (1&l ...

  5. CF1146G Zoning Restrictions 最小割

    CF1146G Zoning Restrictions 最小割 题意: 你准备在一条街上建房子.这条街上共有nn个地方可以用来建房子,每个房子高度最高为h.若你建了一个高度为aa的房子,那你将得到a^ ...

  6. 【最小割】Gym - 101982 - E - Cops And Roobers

    题目链接<http://codeforces.com/gym/240837> 题意: 给你一张地图,里面有一个小偷.要求建造一些围栏把小偷圈住,有些地方不可造围栏,有些地方可造,但代价不同 ...

  7. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  8. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  9. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

最新文章

  1. 4 行 Python 代码获取所在城市天气预报
  2. mysql 拷贝数据库 表存在却打不开_mysql数据库文件复制后表打不开
  3. ORA-14400: inserted partition key does not map to any partition
  4. sqlmap代理池_sqlmap +外部代理池绕过IP拦截
  5. NYOJ 676 小明的求助
  6. 简单爬虫-爬取免费代理ip
  7. Oracle具有开放性吗,Oracle数据库的特点与工作原理
  8. bat 发送post请求_get post 请求
  9. Java IdentityHashMap put()方法与示例
  10. java制作oracle程序,Java程序操作Oracle两种方式之简单实现
  11. 实现算法2.11、2.12的程序
  12. Convert.ToString和ToString的区别
  13. NS2中认知无线电仿真
  14. ZZULIOJ 1030~1039(oj入门题)
  15. 小白文件管理器android,小白文件管理器手机版
  16. 解决:本地计算机无法复制文件到远程计算机
  17. DOA算法3:Matrix Pencil
  18. java文件拒绝访问权限_运行java文件,一直显示拒绝访问,谁知道哪里出了問題≥﹏≤...
  19. 大星星学物联网概览篇-硬件
  20. esclip直接快捷键构造函数_IntelliJ Idea 常用快捷键

热门文章

  1. JDBC——实现通用的查询
  2. 关于maven面试的哪些事儿~
  3. python监控windows日志_Python 监控日志的简单示例
  4. php 10的次方,动态 - 1的10次方 - OSCHINA - 中文开源技术交流社区
  5. java编写服务器_java编写一个简单的回射服务器
  6. 条件队列java_Java并发系列(4)AbstractQueuedSynchronizer源码分析之条件队列
  7. 数mysql据分析优化_从零开始学习数据分析-mysql架构与优化理论
  8. 计算机组成原理第二版第4章的答案,计算机组成原理第4章习题参考答案
  9. displayprime java_java - “没有X11 DISPLAY变量” - 这是什么意思?
  10. mysql 时间 设计模式_数据库时间设计模式