BZOJ 1412 狼和羊的故事

这个妥妥的最小割,但是我想了好久。。。。

考虑所有羊连源点,狼连汇点,相邻点两边跑最小割(最大流)即可。

正确性?考虑类似一个二分图的东西,我们只需要把狼集合和羊集合拦腰斩断即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxe 100005
#define maxv 10011
#define inf 1234567
#define s 0
#define t 10010
using namespace std;
int n,m,map[105][105],dx[]={0,0,1,0,-1},dy[]={0,1,0,-1,0};
int dis[maxv],g[maxv],nume=1;
struct edge
{
int v,f,nxt;
}e[maxe];
void addedge(int u,int v,int flow)
{
e[++nume].v=v;
e[nume].nxt=g[u];
e[nume].f=flow;
g[u]=nume;
e[++nume].v=u;
e[nume].nxt=g[v];
e[nume].f=0;
g[v]=nume;
}
void build()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (map[i][j]==1) addedge(s,(i-1)*m+j,inf);
else if (map[i][j]==2) addedge((i-1)*m+j,t,inf);
for (int k=1;k<=4;k++)
{
int tx=i+dx[k],ty=j+dy[k];
if ((tx>=1) && (tx<=n) && (ty>=1) && (ty<=m))
addedge((i-1)*m+j,(tx-1)*m+ty,1);
}
}
}
bool bfs()
{
memset(dis,-1,sizeof(dis));
queue <int> q;
q.push(s);
dis[s]=0;
while (!q.empty())
{
int head=q.front();
q.pop();
for (int i=g[head];i;i=e[i].nxt)
{
if ((e[i].f>0) && (dis[e[i].v]<0))
{
dis[e[i].v]=dis[head]+1;
q.push(e[i].v);
}
}
}
if (dis[t]==-1) return false;
return true;
}
int dinic(int x,int low)
{
if (x==t) return low;
int ret=0;
for (int i=g[x];low && i;i=e[i].nxt)
{
if ((e[i].f!=0) && (dis[e[i].v]==dis[x]+1))
{
int dd=dinic(e[i].v,min(low,e[i].f));
low=low-dd;
ret=ret+dd;
e[i].f=e[i].f-dd;
e[i^1].f=e[i^1].f+dd;
}
}
if (ret==0) dis[x]=-1;
return ret;
}
int main()
{
memset(map,0,sizeof(map));
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
build();
int ans=0;
while (bfs()==true)
ans=ans+dinic(s,inf);
printf("%d\n",ans);
return 0;
}

时间: 2024-08-09 22:22:31

BZOJ 1412 狼和羊的故事的相关文章

BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )

显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了 -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10009; const int INF = 10

bzoj1412: [ZJOI2009]狼和羊的故事

1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2614  Solved: 1335[Submit][Status][Discuss] Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱

ZJOI2009 狼和羊的故事

既然这题这么水,我就不写了…… 挖掘栅栏的本质:只能建在相邻两个,且建好后使得狼和羊之间不存在通路.而割的定义是:使S集和T集不存在通路.而题目又要求建的栅栏最少,于是就是最小割问题了. 从源点向所有狼连一条∞的边,从所有羊向汇点连一条∞的边,这样就能保证狼和羊都在不同的点集里.然后再从狼到相邻的羊和空地,空地到相邻的空地和羊连一条流量为1的边,最大流求最小割即可. 或者将所有点向四周连边..就是时间长了点 --hzwer 代码:(来自hzwer) 1 #include<iostream> 2

【BZOJ1412】[ZJOI2009]狼和羊的故事 最小割

[BZOJ1412][ZJOI2009]狼和羊的故事 Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已.所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养. 通过仔细观察

洛谷 P2598 [ZJOI2009]狼和羊的故事

P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已.所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养. 通过仔细观察,Orez发现狼和羊都

【BZOJ 1412】[ZJOI2009]狼和羊的故事

Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已.所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养. 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆

BZOJ 1412: [ZJOI2009]狼和羊的故事【网络流】

Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已.所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养. 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆

BZOJ 1412 ZJOI 2009 狼和羊的故事 最小割

题目大意:一个农场中有狼和羊,现在要将他们用围栏分开,问最少需要多少围栏. 思路:所有源向所有狼连边,所有羊向汇连边,图中的每个相邻的格子之间连边,然后跑S->T的最大流,也就是把狼和羊分开的最小割. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 11000 #d

1412: [ZJOI2009]狼和羊的故事

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4017  Solved: 2037[Submit][Status][Discuss] Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们