2017.10.10 狼和羊的故事 思考记录
二集合划分问题,,花费最小,果断最小割
首先狼和羊可能会被分割,所以不能直接在原图上跑
所以可以考虑羊向狼建边,,但流量是受图的限制的,所以把0也考虑进来,一次只向相邻的一格连边
直接跑dinic即可
注:建图时注意 (i-1)*m 而不是 i*(n-1)。。
码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 200005
#define inf 100007
int tot=-1,s,t,hou[N],d[N],xia[N],zhong[N],v[N],yuan[N],i,n,m,j,tu[105][105];
queue<int>q;
void jian(int a,int b,int c)
{++tot,zhong[tot]=b,hou[tot]=yuan[a],yuan[a]=tot,v[tot]=c;
}
void jia(int a,int b,int c)
{jian(a,b,c);jian(b,a,0);
}
bool bfs()
{for(i=1;i<=t;i++){xia[i]=yuan[i];
d[i]=inf;}q.push(s);d[s]=1;while(!q.empty()){int st=q.front();q.pop();for(i=xia[st];i!=-1;i=hou[i]){int nd=zhong[i];if(v[i]==0||d[nd]!=inf)continue;d[nd]=d[st]+1; q.push(nd);} }return d[t]<inf;
}
int dfs(int o,int t,int limit)
{if(limit==0||o==t)return limit;int i,f,flow=0;for(i=xia[o];i!=-1;i=hou[i]){xia[o]=i;int st=zhong[i];if(d[st]==d[o]+1&&(f=dfs(st,t,min(v[i],limit)))){//cout<<f;v[i]-=f;v[i^1]+=f;flow+=f;limit-=f;if(limit==0)break; } }return flow;
}
int dinic()
{int ans=0;while(bfs()){ans+=dfs(s,t,inf);}return ans;
}
int main()
{
memset(yuan,-1,sizeof(yuan));scanf("%d%d",&n,&m);s=n*m+5;t=n*m+6;for(i=1;i<=n;i++)for(j=1;j<=m;j++){scanf("%d",&tu[i][j]); }for(i=1;i<=n;i++)for(j=1;j<=m;j++){if(tu[i][j]==0){if(j-1>=1)jia((i-1)*m+j,(i-1)*m+j-1,1);if(i-1>=1)jia((i-1)*m+j,(i-2)*m+j,1);if(j+1<=m)jia((i-1)*m+j,(i-1)*m+j+1,1);if(i+1<=n)jia((i-1)*m+j,(i)*m+j,1);}if(tu[i][j]==1){jia(s,(i-1)*m+j,4);if(j-1>=1&&tu[i][j-1]!=1)jia((i-1)*m+j,(i-1)*m+j-1,1);if(i-1>=1&&tu[i-1][j]!=1)jia((i-1)*m+j,(i-2)*m+j,1);if(j+1<=m&&tu[i][j+1]!=1)jia((i-1)*m+j,(i-1)*m+j+1,1);if(i+1<=n&&tu[i+1][j]!=1)jia((i-1)*m+j,(i)*m+j,1); }if(tu[i][j]==2){jia((i-1)*m+j,t,4);if(j-1>=1&&tu[i][j-1]!=2)jia((i-1)*m+j,(i-1)*m+j-1,1);if(i-1>=1&&tu[i-1][j]!=2)jia((i-1)*m+j,(i-2)*m+j,1);if(j+1<=m&&tu[i][j+1]!=2)jia((i-1)*m+j,(i-1)*m+j+1,1);if(i+1<=n&&tu[i+1][j]!=2)jia((i-1)*m+j,(i)*m+j,1); }}
printf("%d",dinic());
}
2017.10.10 狼和羊的故事 思考记录相关推荐
- bzoj1412[ZJOI2009]狼和羊的故事
bzoj1412[ZJOI2009]狼和羊的故事 题意: n*m网格,每个格子可能为狼.羊或空格.现在要在一些格子边界篱笆使羊狼分开,求最短篱笆.n,m≤100 题解: 最小割问题,建一个超级源和超级 ...
- 题解 P2598 【[ZJOI2009]狼和羊的故事】
P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...
- [ZJOI2009]狼和羊的故事 题解
狼和羊的故事 怎么说呢,这道题其实不难,只是题意有那么亿点点难理解.我最开始想复杂了,理解为了栅栏长度是格点的周长,那事情就复杂了... 题目分析: 首先,要明确的是:一个狼领地和羊领地之间只需建长度 ...
- BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】
BZOJ1412 ZJOI2009 狼和羊的故事 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 >原题链接< Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......& ...
- 【图论专题二】【网络流部分】狼和羊的故事
[浙江省省选2009]狼和羊的故事 题目 [ZJOI2009]狼和羊的故事 (Standard IO) Time Limits: 1000 ms Memory Limits: 256000 KB De ...
- [bzoj1934]: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3105 Solved: 1567 [Submit][ ...
- JOJ2737:狼与羊的故事(求图上任意两点间的桥边)
2737: 狼与羊的故事 Result TIME Limit MEMORY Limit Run Times AC Times JUDGE 3s 65536K 53 10 Standard 村长要召开 ...
- [ZJOI2009]狼和羊的故事【最小割】
题目链接 P2598 [ZJOI2009]狼和羊的故事 要让羊和狼都区别开来,需要的最小的割是多少?每只羊向四周有4个可能的方向,每只狼也是同样的,所以每个动物向周围可以跑出4个流,我们要建立栅栏,可 ...
最新文章
- Centos7更改root密码
- keras 使用多GPU
- 从0开始利用宝塔linux面板+DSShop搭建一个简单的购物网站
- ws5102怎么设置虚拟服务器,【华为路由器WS5102怎么设置开双频】规格参数|限速|APP|配置|功耗_摘要频道_什么值得买...
- ios framework 调用第三方 framework_Python基础:标准库和常用的第三方库
- [转载] 大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理
- 疑似小米10系列真机谍照首曝光:挖孔双曲面屏设计无疑
- 一元函数积分学基本计算例题
- css样式鼠标放上去变成手的形状
- win8计算机的录音功能,win8电脑录音机功能在哪|win8录音功能使用方法
- AVS3中的AMVR和EMVR
- 阿里云部署数据库(遇到的问题及解决方案)
- java货物进销管理系统【电竞杜小帅】
- 自动化之旅--Appium
- 11 边缘保留滤波(EPF)
- 看《越狱》体会项目管理-知识管理-性格分析
- Android使用RecyclerView实现上拉加载更多,下拉刷新,分组显示
- 东方不败III游戏修改大师
- [原创]ExtAspNet秘密花园(二) — 一切从头开始
- java web信息管理系统_Java web学生信息管理系统