题意:

给定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 最小割相关推荐

  1. HDU - 3987 Harry Potter and the Forbidden Forest(最小割最少边数)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的图,求最小割的最小边数 题目分析:和hdu6214大同小异,都是模板题,这个题目用第一种方法,也就是先跑一遍最大流,然后修改一下残余网络上的 ...

  2. HDU 3046Pleasant sheep and big big wolf(切最小网络流)

    职务地址:HDU 3046 最小割第一发!事实上也没什么发不发的. ..最小割==最大流.. 入门题,可是第一次入手最小割连入门题都全然没思路... sad..对最小割的本质还是了解的不太清楚.. 这 ...

  3. hdu 3046(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 思路:最小割的入门题,设源点为0,汇点为n*m+1,源点与点为2的连一天容量为inf的边,汇点与 ...

  4. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

  5. HDU 4859 海岸线 最小割

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...

  6. hdu 3046(最小割最大流)

    题意:在一个单位方格边长为1的矩阵中藏着灰太狼和它的同伴,等待着喜羊羊和它的同伴,为了不让喜羊羊和同伴被抓住,我们可以在矩形草坪中设置单位长度为1的栅栏,求最短的栅栏长度. 解题思路:这道题是要把狼和 ...

  7. HDU 2952 Counting Sheep (DFS找联通块)

    题目链接:请戳这里.   题目大意及思路:读懂题意就好了,就是DFS找联通块. 没什么好说的,见代码吧. #include<cstdio> #include<cstring> ...

  8. 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)

    题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...

  9. hdu 1867 求两个串的和最小 ,KMP

    题意:       给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...

最新文章

  1. JS正则表达式验证数字
  2. micro-mvc框架支持mvc各层业务代码热部署
  3. AI:Algorithmia《2020 state of enterprise machine learning—2020年企业机器学习状况》翻译与解读
  4. eq相等,smarty 比较操作符!时间戳
  5. 哈哈哈,第一次做codeforce
  6. 用python进行文本分析_用Python分析文本文件
  7. Linux命令行大全(第二版)
  8. Microsoft Navision 4.0帮助您消除日常工作流程中的烦恼的7条途径
  9. 提取地图中道路_准确度93%!人工智能如何完成高精度的地图特征推测?丨城市数据派...
  10. ALCO单螺母SN系列面板安装球阀
  11. 浅谈shadow dom
  12. 那一年,程维去洗脚城打工,王兴第十次创业失败,张一鸣第五次换工作……...
  13. Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?
  14. 四面阿里失败,因得到P8指点痛心修炼3个月,收到字节35*14offer(Java岗)
  15. 转载:在阿里工作四个月经历的总结
  16. 游戏王,查卡器,编号,开源,代码,OCG,程序
  17. byte json 互转_Json互转
  18. GitHub 被超火的 ChatGPT 霸榜!
  19. 视频教程-Spring Boot实战入门视频课程-Java
  20. 【LeetCode第59题】长舒一口气,终于学会了这苦涩难懂的 螺旋矩阵II

热门文章

  1. Flutter ListView解决底部或顶部留白问题
  2. pacman安装ubuntu_为什么tensorflow用户宁可ubuntu繁琐步骤搭建环境,也不用一条命令直达的manjaro?...
  3. 泛华金控携手神策数据,赋能保险经代公司筑就全闭环智能营销
  4. Android 曝光采集:以商品 view 曝光量的统计为例
  5. 简便的chrome插件安装
  6. 苹果看好医疗健康产业 AI技术将变革
  7. Tomcat7调试运行环境搭建与源代码分析入门
  8. 微信小程序想要最短服务路径
  9. Android 基础(二十四) EditText
  10. What every programmer needs to know about game networking