BZOJ 2929--洞穴攀行(最大流)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 2929--洞穴攀行(最大流)相关的知识,希望对你有一定的参考价值。
最大流模版题。。。
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=2929
Solution
与起点或终点连接的边流量可以无限大,其他边流量最大为1,求最大流。。。
上模版就好了。。。。
代码
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #define inf 1000000000 using namespace std; inline int read(){ int x=0;char ch=getchar(); while(ch<‘0‘||ch>‘9‘)ch=getchar(); while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x; } int n,cnt=1,ans; int h[205],q[205],last[205],cur[205]; struct edge{ int to,next,v; }e[40005]; void insert(int u,int v,int w){ e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[cnt].v=w; e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;e[cnt].v=0; } bool bfs(){ int head=0,tail=1; memset(h,-1,sizeof(h)); h[1]=0; q[0]=1; while(head!=tail){ int now=q[head];head++; for(int i=last[now];i;i=e[i].next) if(e[i].v&&h[e[i].to]==-1){ h[e[i].to]=h[now]+1; q[tail++]=e[i].to; } } return h[n]!=-1; } int dfs(int x,int f){ if(x==n)return f; int w,used=0; for(int i=last[x];i;i=e[i].next) if(h[x]+1==h[e[i].to]){ w=f-used; w=dfs(e[i].to,min(e[i].v,w)); e[i].v-=w;e[i^1].v+=w; used+=w; if(used==f)return f; } if(!used)h[x]=-1; return used; } void dinic(){ while(bfs()) ans+=dfs(1,inf); } int main(){ n=read(); int x; for(int i=1;i<n;i++){ x=read(); while(x--){ int v=read(); if(i==1||v==n)insert(i,v,1); else insert(i,v,inf); } } dinic(); printf("%d",ans); return 0; }
This passage is made by Iscream-2001.
以上是关于BZOJ 2929--洞穴攀行(最大流)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj3382[Usaco2004 Open]Cave Cows 3 洞穴里的牛之三*
bzoj3380[Usaco2004 Open]Cave Cows 1 洞穴里的牛之一*