热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU1733分层最大流

假如说,16*16256个位置有255个人和一个门的话,那么需要255*21层。显然爆掉。但是这道题据别的大佬题解说也就100层,并且可以

假如说,16*16 = 256个位置有255个人和一个门的话,那么需要255 * 2 + 1层。显然爆掉。但是这道题据别的大佬题解说也就100层,并且可以直接分层最大流(100层256满边连接的话,E = V = 2.5e4,V^2E也会爆掉)。
知道这些就是个水题了,直接套板子就好,分层的时候注意下每层的增量就好了。

#include
#include
#include
#include
#include
using namespace std;
const int maxn = 100010;
const int maxm = 400010;
const int INF = 0x3f3f3f3f;
struct edge {int to , next, cap, flow;
}e[maxm];struct ISAP{int n;int tol;int head[maxn];int num[maxn];int dep[maxn], cur[maxn];int q[maxn];int p[maxn];void init(int n){tol &#61; 0;this-> n &#61; n;ans &#61; 0;memset(head, -1, sizeof(head));}void addedge(int u, int v, int c, int rw &#61; 0){e[tol].to &#61; v;e[tol].cap &#61; c;e[tol].flow &#61; 0;e[tol].next &#61; head[u];head[u] &#61; tol &#43;&#43;;e[tol].to &#61; u;e[tol].cap &#61; rw;e[tol].flow &#61; 0;e[tol].next &#61; head[v];head[v] &#61; tol &#43;&#43;;}void bfs(int t){memset(dep, -1, sizeof(dep));memset(num, 0, sizeof(num));num[0] &#61; 1;int front &#61; 0;int rear &#61; 0;dep[t] &#61; 0;q[rear&#43;&#43;] &#61; t;while(front !&#61; rear){int u &#61; q[front &#43;&#43;];for(int i &#61; head[u]; i !&#61; -1; i &#61; e[i].next){int v &#61; e[i].to;if(dep[v] !&#61; -1)continue;q[rear&#43;&#43;] &#61; v;dep[v] &#61; dep[u] &#43; 1;num[dep[v]] &#43;&#43;;}}}int ans &#61; 0;int Maxflow(int s, int t){bfs(t);memcpy(cur, head, sizeof(head));int top &#61; 0;int u &#61; s;while(dep[s] < n){if(u &#61;&#61; t){int Min &#61; INF;int inser;for(int i &#61; 0; i < top; i &#43;&#43;){if(Min > e[p[i]].cap - e[p[i]].flow){Min &#61; e[p[i]].cap - e[p[i]].flow;inser &#61; i;}}for(int i &#61; 0; i < top; i &#43;&#43;){e[p[i]].flow &#43;&#61; Min;e[p[i] ^ 1].flow -&#61; Min;}top &#61; inser;u &#61; e[p[top]^ 1].to;ans &#43;&#61; Min;continue;}bool flag &#61; false;int v;for(int i &#61; cur[u]; i !&#61; -1; i &#61; e[i].next){v &#61; e[i].to;if(e[i].cap - e[i].flow && dep[v] &#43; 1 &#61;&#61; dep[u]){flag &#61; true;cur[u] &#61; i;break;}}if(flag){p[top&#43;&#43;] &#61; cur[u];u &#61; v;continue;}int Min &#61; n;for(int i &#61; head[u]; i !&#61; -1 ; i &#61; e[i].next){if(e[i].cap- e[i].flow && dep[e[i].to] < Min){Min &#61; dep[e[i].to];cur[u] &#61; i;}}num[dep[u]]--;if(!num[dep[u]]) return ans;dep[u] &#61; Min &#43; 1;num[dep[u]] &#43;&#43;;if(u !&#61; s) u &#61; e[p[--top] ^ 1].to;}return ans;}
}isap;int offsetx[5] &#61; {0, 1, -1, 0, 0};
int offsety[5] &#61; {1, 0, 0, -1, 0};
int n, m, u, v, cost;
char tma[20];
int ma[20][20];bool bfs(int x, int y)
{bool vis[20][20] &#61; {false};queue <int> q;vis[x][y] &#61; true;q.push(x * 100 &#43; y);while(!q.empty()){int temp &#61; q.front();q.pop();int tempx &#61; temp / 100;int tempy &#61; temp % 100;if(ma[tempx][tempy] &#61;&#61; 2){return true;}vis[tempx][tempy] &#61; true;for(int i &#61; 0; i < 4; i &#43;&#43;){int tx &#61; tempx &#43; offsetx[i];int ty &#61; tempy &#43; offsety[i];if(tx >&#61; 0 && tx < n && ty >&#61; 0 && ty < m && !vis[tx][ty] && ma[tx][ty] !&#61; -1){q.push(tx * 100 &#43; ty);vis[tx][ty] &#61; true;}}}return false;
}bool judge()
{for(int i &#61; 0; i < n; i &#43;&#43;){for(int j &#61; 0; j < m; j &#43;&#43;){if(ma[i][j] &#61;&#61; 1){if(!bfs(i, j)){//cout<return false;}}}}return true;
}
int main() {while(scanf("%d%d", &n, &m) !&#61; EOF){bool flag &#61; 0;int tol &#61; 0;//int s &#61; 52101;//int t &#61; 52102;int s &#61; n * m * 2 * 100 &#43; 1;int t &#61; s &#43; 1;isap.init(t &#43; 1);const int base &#61; n * m;for(int i &#61; 0; i < n; i &#43;&#43;){scanf("%s", tma);for(int j &#61; 0; j < m; j &#43;&#43;){if(tma[j] &#61;&#61; &#39;X&#39;){ma[i][j] &#61; 1;int temp &#61; i * m &#43; j;isap.addedge(s, temp, 1);tol &#43;&#43;;}if(tma[j] &#61;&#61; &#39;&#64;&#39;){ma[i][j] &#61; 2;}if(tma[j] &#61;&#61; &#39;#&#39;){ma[i][j] &#61; -1;}if(tma[j] &#61;&#61; &#39;.&#39;){ma[i][j] &#61; 0;}}}if(!judge()){printf("-1\n");continue;}for(int k &#61; 0; k <&#61; 60; k &#43;&#43;){for(int i &#61; 0; i < n; i &#43;&#43;){for(int j &#61; 0; j < m ; j &#43;&#43;){if(ma[i][j] &#61;&#61; -1)continue;int in &#61; i * m &#43; j &#43; k * base * 2;int out &#61; in &#43; base;isap.addedge(in, out, 1);if(ma[i][j] &#61;&#61; 2){isap.addedge(out, t, 1);}for(int l &#61; 0; l < 5; l &#43;&#43;){int tempx &#61; i &#43; offsetx[l];int tempy &#61; j &#43; offsety[l];if(tempx >&#61; 0 && tempx < n && tempy >&#61; 0 && tempy < m){if(ma[tempx][tempy] !&#61; -1){int tin &#61; tempx * m &#43; tempy &#43; (k &#43; 1) * 2 * base;isap.addedge(out, tin, 1);}}}}}int lll &#61; isap.Maxflow(s, t);//cout<if( lll &#61;&#61; tol){printf("%d\n", k);flag &#61; 1;break;}}}return 0;
}

推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
author-avatar
徐州九七医院沁尿外科1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有