洛谷 - P2598 - 狼和羊的故事 - 最大流
https://www.luogu.org/problemnew/show/P2598
第一次写这种修篱笆的题目,上次好像晓阳dalao写了一个堵人的。好像还有能改变土地属性的。
#include<bits/stdc++.h>
using namespace std;
#define ll long long /* dinic begin */ const int MAXN=;
const int MAXM=;
const int INF=0x3f3f3f3f;
struct Edge{
int to,next,cap,flow;
}edge[MAXM]; int tol;
int head[MAXN]; void init(){
tol=;
memset(head,-,sizeof(head));
} void addedge(int u,int v,int w){
edge[tol].to=v;edge[tol].cap=w;edge[tol].flow=;
edge[tol].next=head[u];head[u]=tol++;
edge[tol].to=u;edge[tol].cap=;edge[tol].flow=;
edge[tol].next=head[v];head[v]=tol++;
} int Q[MAXN];
int dep[MAXN],cur[MAXN],sta[MAXN];
bool bfs(int s,int t,int n){
int front=,tail=;
memset(dep,-,sizeof(dep[])*(n+));
dep[s]=;
Q[tail++]=s;
while(front<tail){
int u=Q[front++];
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(edge[i].cap>edge[i].flow&&dep[v]==-){
dep[v]=dep[u]+;
if(v==t)
return true;
Q[tail++]=v;
}
}
}
return false;
} int dinic(int s,int t,int n){
//n最后一个节点的编号的下一个编号
int maxflow=;
while(bfs(s,t,n)){
for(int i=;i<n;i++)cur[i]=head[i];
int u=s,tail=;
while(cur[s]!=-){
if(u==t){
int tp=INF;
for(int i=tail-;i>=;i--){
tp=min(tp,edge[sta[i]].cap-edge[sta[i]].flow); }
maxflow+=tp;
for(int i=tail-;i>=;i--){
edge[sta[i]].flow+=tp;
edge[sta[i]^].flow-=tp;
if(edge[sta[i]].cap-edge[sta[i]].flow==)
tail=i;
}
u=edge[sta[tail]^].to; }
else if(cur[u]!=-&&edge[cur[u]].cap>edge[cur[u]].flow
&&dep[u]+==dep[edge[cur[u]].to]){
sta[tail++]=cur[u];
u=edge[cur[u]].to;
}
else{
while(u!=s&&cur[u]==-){
u=edge[sta[--tail]^].to;
}
cur[u]=edge[cur[u]].next;
}
}
}
return maxflow;
} /* dinic end */ int g[][]; int m,n;
int main(){
init();
scanf("%d%d",&n,&m); for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&g[i][j]);
}
} int s=,t=n*m+;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(g[i][j]==){
addedge(s,(i-)*m+j,INF);
}
else if(g[i][j]==){
addedge((i-)*m+j,t,INF);
}
}
} for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(g[i][j]==||g[i][j]==){
if(j->=&&g[i][j-]!=){
addedge((i-)*m+j,(i-)*m+j-,);
//addedge((i-1)*m+j-1,(i-1)*m+j,1);
}
if(i->=&&g[i-][j]!=){
addedge((i-)*m+j,(i-)*m+j,);
//addedge((i-2)*m+j,(i-1)*m+j,1);
}
if(j+<=m&&g[i][j+]!=){
addedge((i-)*m+j,(i-)*m+j+,);
//addedge((i-1)*m+j+1,(i-1)*m+j,1);
}
if(i+<=n&&g[i+][j]!=){
addedge((i-)*m+j,i*m+j,);
//addedge(i*m+j,(i-1)*m+j,1);
}
//羊可以在所有和他不同的格子修篱笆
}
/*else if(g[i][j]==0){
//空地可以向任何方向修篱笆,但不需要向羊修
if(j-1>=1&&g[i][j-1]!=1){
addedge((i-1)*m+j,(i-1)*m+j-1,1);
}
if(i-1>=1&&g[i][j]!=g[i-1][j]){
addedge((i-1)*m+j,(i-2)*m+j,1);
}
if(j+1<=m&&g[i][j]!=g[i][j+1]){
addedge((i-1)*m+j,(i-1)*m+j+1,1);
}
if(i+1<=n&&g[i][j]!=g[i+1][j]){
addedge((i-1)*m+j,i*m+j,1);
}
}*/
}
} int maxflow=dinic(s,t,t); printf("%d\n",maxflow); }
洛谷 - P2598 - 狼和羊的故事 - 最大流的更多相关文章
- 【Luogu】P2598狼和羊的故事(最小割转最大流)
		题目链接 最小割水题.入点向白点连边,白点向白点.黑点和空点连边,空点向空点和黑点连边,黑点向黑点和汇点连边.然后跑最大流即可. 话说Fd最近怎么光做水题啊……一点用都没有……qwq 我太菜了,做完一 ... 
- 最大流最小割——bzoj1001狼抓兔子,洛谷P2598
		前置知识 平面图 平面图就是平面上任意边都不相交的图.(自己瞎画的不算XD) 对偶图 比如说这个图,我们发现平面图肯定会把平面分成不同的区域(感觉像拓扑图),并把这些区域当做每个点(不被包围的区域独自 ... 
- 洛谷 P2598 [ZJOI2009]狼和羊的故事 解题报告
		P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" \(Orez\)听到这首歌, ... 
- P2598 [ZJOI2009]狼和羊的故事(网络流)
		P2598 [ZJOI2009]狼和羊的故事 源点和所有狼连 $inf$ 的边 所有羊和汇点连 $inf$ 的边 所有点向四周连 $1$ 的边 这样所有狼和羊之间的边都被割掉了 统计最小割就好辣 #i ... 
- 题解 P2598 【[ZJOI2009]狼和羊的故事】
		P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ... 
- P2598 [ZJOI2009]狼和羊的故事(最小割)
		P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么 ... 
- P2598 [ZJOI2009]狼和羊的故事(最小割)
		P2598 [ZJOI2009]狼和羊的故事 说真的,要多练练网络流的题了,这么简单的网络流就看不出来... 题目要求我们要求将狼和羊分开,也就是最小割,(等等什么逻辑...头大....) 我们这样想 ... 
- bzoj1412: [ZJOI2009]狼和羊的故事
		空地之间开始没有连然后一直WA...题意混乱...尴尬. #include<cstdio> #include<cstring> #include<iostream> ... 
- BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )
		显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了 -------------------------------------------------------- ... 
随机推荐
- go使用时间作为种子生成随机数
			原文:http://blog.csdn.net/qq_15437667/article/details/50851159 --------------------------------------- ... 
- BZOJ 题目1036: [ZJOI2008]树的统计Count(Link Cut Tree,改动点权求两个最大值和最大值)
			1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8421 Solved: 3439 [Submi ... 
- SolidEdge 工程图中如何快速将同一类元素放到同一个图层
			在图层选项卡中新建一个尺寸线图层 点击聪慧选项(把它点凹下去),然后点击任意尺寸线,弹出聪慧选取选项,点击确定,则自动选择了所有尺寸线 点击移动图元,把刚才选中的所有尺寸线都移动到这个图层即可 ... 
- vs2015使用Git管理项目
			初级 1,在码云上去注册一个帐号(码云的私有库是免费的,安全性怎么样我不知道) 2,在码云上新建一个项目,把相关的开发人员加到这个项目里,会得到这个项目在码云上的远程仓库的地址. 3,打开vs2015 ... 
- Intel processor brand names-Xeon,Core,Pentium,Celeron----Pentium
			http://en.wikipedia.org/wiki/Pentium Pentium From Wikipedia, the free encyclopedia This article ... 
- android经常使用正则工具类
			此类提供日常开发中经常使用的正则验证函数.比方:邮箱.手机号.电话号码.身份证号码.日期.数字.小数.URL.IP地址等.使用Pattern对象的matches方法进行整个字符匹配,调用该方法相当于: ... 
- Mysql整数运算NULL值处理注意点
			CleverCode近期在导出报表的时候,在整数做减法的时候,发现整数减去null得到是null.这是一个细节问题,希望大家以后注意. 1 表中的数据 total,used都是整形,同意为空. 2 有 ... 
- React Native安装
			1.安装 1.1 安装Node.js 下载安装即可 1.2 安装Homebrew 终端中执行: $ /usr/bin/ruby -e "$(curl -fsSL https://raw.gi ... 
- 关于 truncate table 的一点学习札记
			---下面整理笔记来之 itpub 的各位前辈的语录.这里做了一个汇总.仅供学习. truncate table后,oracle会回收表和其表中所在的索引到initial 大小,也就是初始分配的seg ... 
- IE8与vs2005冲突 添加MFC类向导错误解决方法—— internet explorer脚本错误
			IE8 与 VS2005 冲突问题解决方法 问题表现为: MFC类向导添加类时,出现“当前页面的脚本发生错误”,进入MFC类向导后上方有一个小黄条“此网站的某个加载项运行失败.请检查"Int ... 
