HDU 3046 Pleasant sheep and big big wolf
2013-10-29 14:46
351 查看
题意:给出一个N*M的矩阵,0表示空地,1表示有一只羊,2表示有一只狼,你可以再图上方格的边缘添加单位长度为1的栅栏使得任意的动物都不能通过。问最少添加多少个单位长度为1的栅栏使得狼抓不到羊。
是我想的太多了,可能是因为我想少去建条边。其实这里件图建的还是很暴力的。对所有相邻的格子,都建一条cap=1的边,另外,所有有羊的格子,从源点S到羊所在的格子建一条cap=inf的边,对所有有狼的格子,都从有狼的格子到汇点T建一条cap=1的边。求出的最小割容量就是答案。
View Code
是我想的太多了,可能是因为我想少去建条边。其实这里件图建的还是很暴力的。对所有相邻的格子,都建一条cap=1的边,另外,所有有羊的格子,从源点S到羊所在的格子建一条cap=inf的边,对所有有狼的格子,都从有狼的格子到汇点T建一条cap=1的边。求出的最小割容量就是答案。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define INF 1<<30 #define maxn 41000 #define maxm 400000 using namespace std; int v[maxm],next[maxm],w[maxm]; int first[maxn],d[maxn],work[maxn],q[maxn]; int n,m,maxflow,mincost,bg_cnt,e_cnt,t_cnt; int e,S,T; void init(){ e = 0; memset(first,-1,sizeof(first)); } void add_edge(int a,int b,int c){ //printf("add:%d to %d,cap = %d\n",a,b,c); v[e] = b;next[e] = first[a];w[e] = c;first[a] = e++; v[e] = a;next[e] = first[b];w[e] = 0;first[b] = e++; } int bfs(){ int rear = 0; memset(d,-1,sizeof(d)); d[S] = 0;q[rear++] = S; for(int i = 0;i < rear;i++){ for(int j = first[q[i]];j != -1;j = next[j]) if(w[j] && d[v[j]] == -1){ d[v[j]] = d[q[i]] + 1; q[rear++] = v[j]; if(v[j] == T) return 1; } } return 0; } int dfs(int cur,int a){ if(cur == T) return a; for(int &i = work[cur];i != -1;i = next[i]){ if(w[i] && d[v[i]] == d[cur] + 1) if(int t = dfs(v[i],min(a,w[i]))){ w[i] -= t;w[i^1] += t; return t; } } return 0; } int dinic(){ int ans = 0; while(bfs()){ memcpy(work,first,sizeof(first)); while(int t = dfs(S,INF)) ans += t; } return ans; } int main() { int n,m,kase = 0; while(scanf("%d%d",&n,&m) == 2){ S = 0,T = n*m+1; init(); for(int i = 1;i <= n;i++){ for(int j = 1;j <= m;j++){ int pos = (i-1)*m+j; if(i > 1) add_edge(pos,pos-m,1); if(i < n) add_edge(pos,pos+m,1); if(j > 1) add_edge(pos,pos-1,1); if(j < m) add_edge(pos,pos+1,1); int tmp; scanf("%d",&tmp); if(tmp == 1) add_edge(S,pos,INF); if(tmp == 2) add_edge(pos,T,INF); } } int ans = dinic(); printf("Case %d:\n%d\n",++kase,ans); } return 0; }
View Code
相关文章推荐
- HDU 3046 Pleasant sheep and big wolf(最小割最大流+Dinic)
- hdu 3046 Pleasant sheep and big big wolf 最小割
- HDU-3046 Pleasant sheep and big big wolf
- hdu 3046 Pleasant sheep and big big wolf【最大流Dinic--------最小割】
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割-Dinic)
- 【HDU - 3046】Pleasant sheep and big big wolf 【最大流-最小割】
- HDU 3046 Pleasant sheep and big big wolf(SAP,Dinic模板)
- hdu-3046-Pleasant sheep and big big wolf(最大流最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- HDU - 3046 Pleasant sheep and big big wolf(最小割)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割)
- hdu 3046 Pleasant sheep and big big wolf 最小割
- HDU 3046 Pleasant sheep and big big wolf(最小割)
- hdu 3046 Pleasant sheep and big big wolf(sap最大流)
- hdu 3046 Pleasant sheep and big big wolf
- hdu 3046 Pleasant sheep and big big wolf 网络流