HDU 3046 Pleasant sheep and big big wolf 最小割
题意:
给定n*m个点的矩阵
0为空点。1为羊。2为狼
相邻点之间有一条路。
问要使得狼与羊不连通最少要去掉几条边
最小割
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;#define ll int #define N 40010
#define M 105000
#define inf 1073741824
#define inf64 1152921504606846976
struct Edge{ ll from, to, cap, nex, max;
}edge[M*4];//注意这个一定要够大 不然会re 还有反向弧 ll head[N], edgenum;
void add(ll u, ll v, ll cap){ Edge E = { u, v, cap, head[u],cap}; edge[ edgenum ] = E; head[u] = edgenum ++; Edge E2= { v, u, 0, head[v],cap}; edge[ edgenum ] = E2; head[v] = edgenum ++;
}
ll sign[N];
bool BFS(ll from, ll to){ memset(sign, -1, sizeof(sign)); sign[from] = 0; queue<ll>q; q.push(from); while( !q.empty() ){ int u = q.front(); q.pop(); for(ll i = head[u]; i!=-1; i = edge[i].nex) { ll v = edge[i].to; if(sign[v]==-1 && edge[i].cap) { sign[v] = sign[u] + 1, q.push(v); if(sign[to] != -1)return true; } } } return false;
}
ll Stack[N], top, cur[N];
ll dinic(ll from, ll to){ ll ans = 0; while( BFS(from, to) ) { memcpy(cur, head, sizeof(head)); ll u = from; top = 0; while(1) { if(u == to) { ll flow = inf, loc;//loc 表示 Stack 中 cap 最小的边 for(ll i = 0; i < top; i++) if(flow > edge[ Stack[i] ].cap) { flow = edge[Stack[i]].cap; loc = i; } for(ll i = 0; i < top; i++) { edge[ Stack[i] ].cap -= flow; edge[Stack[i]^1].cap += flow; } ans += flow; top = loc; u = edge[Stack[top]].from; } for(ll i = cur[u]; i!=-1; cur[u] = i = edge[i].nex)//cur[u] 表示u所在能增广的边的下标 if(edge[i].cap && (sign[u] + 1 == sign[ edge[i].to ]))break; if(cur[u] != -1) { Stack[top++] = cur[u]; u = edge[ cur[u] ].to; } else { if( top == 0 )break; sign[u] = -1; u = edge[ Stack[--top] ].from; } } } return ans;
} void init(){memset(head,-1,sizeof head);edgenum = 0;}int mp[205][205];
int n, m;
int Hash(int x,int y){return (x-1)*m+y;}
bool inmap(int x,int y){return 1<=x&&x<=n&&1<=y&&y<=m;}
int w[N], s[N], step[4][2] = {1,0,-1,0,0,1,0,-1};
int main()
{int u, v, d, i, j, Cas = 1;while(~scanf("%d %d",&n,&m)){init();int wt = 0, st = 0;for(i = 1; i <= n; i++){for(j = 1; j <= m; j++){scanf("%d",&mp[i][j]);int now = Hash(i,j);if(mp[i][j]==1)s[st++] = now;if(mp[i][j]==2)w[wt++] = now;for(int k = 0; k < 4; k++){if(!inmap(i+step[k][0], j+step[k][1]))continue;int go = Hash(i+step[k][0], j+step[k][1]);add(now, go, 1);}}}int from = 0, to = Hash(n,m)+1;for(i = 0; i < wt; i++)add(from, w[i], inf);for(i = 0; i < st; i++)add(s[i], to, inf);printf("Case %d:\n%d\n",Cas++,dinic(from, to));}return 0;
}
/*
4 6
1 0 0 1 0 0
0 1 1 0 0 0
2 0 0 0 0 0
0 2 0 1 1 0*/
HDU 3046 Pleasant sheep and big big wolf 最小割相关推荐
- HDU - 3987 Harry Potter and the Forbidden Forest(最小割最少边数)
题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的图,求最小割的最小边数 题目分析:和hdu6214大同小异,都是模板题,这个题目用第一种方法,也就是先跑一遍最大流,然后修改一下残余网络上的 ...
- HDU 3046Pleasant sheep and big big wolf(切最小网络流)
职务地址:HDU 3046 最小割第一发!事实上也没什么发不发的. ..最小割==最大流.. 入门题,可是第一次入手最小割连入门题都全然没思路... sad..对最小割的本质还是了解的不太清楚.. 这 ...
- hdu 3046(最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 思路:最小割的入门题,设源点为0,汇点为n*m+1,源点与点为2的连一天容量为inf的边,汇点与 ...
- 【HDU】4859 海岸线 黑白染色+最小割
传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...
- HDU 4859 海岸线 最小割
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...
- hdu 3046(最小割最大流)
题意:在一个单位方格边长为1的矩阵中藏着灰太狼和它的同伴,等待着喜羊羊和它的同伴,为了不让喜羊羊和同伴被抓住,我们可以在矩形草坪中设置单位长度为1的栅栏,求最短的栅栏长度. 解题思路:这道题是要把狼和 ...
- HDU 2952 Counting Sheep (DFS找联通块)
题目链接:请戳这里. 题目大意及思路:读懂题意就好了,就是DFS找联通块. 没什么好说的,见代码吧. #include<cstdio> #include<cstring> ...
- 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)
题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...
- hdu 1867 求两个串的和最小 ,KMP
题意: 给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...
最新文章
- JS正则表达式验证数字
- micro-mvc框架支持mvc各层业务代码热部署
- AI:Algorithmia《2020 state of enterprise machine learning—2020年企业机器学习状况》翻译与解读
- eq相等,smarty 比较操作符!时间戳
- 哈哈哈,第一次做codeforce
- 用python进行文本分析_用Python分析文本文件
- Linux命令行大全(第二版)
- Microsoft Navision 4.0帮助您消除日常工作流程中的烦恼的7条途径
- 提取地图中道路_准确度93%!人工智能如何完成高精度的地图特征推测?丨城市数据派...
- ALCO单螺母SN系列面板安装球阀
- 浅谈shadow dom
- 那一年,程维去洗脚城打工,王兴第十次创业失败,张一鸣第五次换工作……...
- Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?
- 四面阿里失败,因得到P8指点痛心修炼3个月,收到字节35*14offer(Java岗)
- 转载:在阿里工作四个月经历的总结
- 游戏王,查卡器,编号,开源,代码,OCG,程序
- byte json 互转_Json互转
- GitHub 被超火的 ChatGPT 霸榜!
- 视频教程-Spring Boot实战入门视频课程-Java
- 【LeetCode第59题】长舒一口气,终于学会了这苦涩难懂的 螺旋矩阵II
热门文章
- Flutter ListView解决底部或顶部留白问题
- pacman安装ubuntu_为什么tensorflow用户宁可ubuntu繁琐步骤搭建环境,也不用一条命令直达的manjaro?...
- 泛华金控携手神策数据,赋能保险经代公司筑就全闭环智能营销
- Android 曝光采集:以商品 view 曝光量的统计为例
- 简便的chrome插件安装
- 苹果看好医疗健康产业 AI技术将变革
- Tomcat7调试运行环境搭建与源代码分析入门
- 微信小程序想要最短服务路径
- Android 基础(二十四) EditText
- What every programmer needs to know about game networking