首页 > 代码库 > BZOJ 2929 Poi1999 洞穴攀行 最大流
BZOJ 2929 Poi1999 洞穴攀行 最大流
题目大意:给定一个有向图,与起点和终点相连的边只能走一次,剩下的边可以走无数次,问起点到终点可以走多少个人
把这题的翻译给我揪出来我要打死他……
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 210 #define INF 0x3f3f3f3f #define S 1 #define T n using namespace std; struct abcd{ int to,f,next; }table[M*M]; int head[M],tot=1; int n,m,ans; int dpt[M]; void Add(int x,int y,int z) { table[++tot].to=y; table[tot].f=z; table[tot].next=head[x]; head[x]=tot; } void Link(int x,int y,int z) { Add(x,y,z); Add(y,x,0); } bool BFS() { static int q[M]; int i,r=0,h=0; memset(dpt,-1,sizeof dpt); q[++r]=S;dpt[S]=1; while(r!=h) { int x=q[++h]; for(i=head[x];i;i=table[i].next) if(table[i].f&&!~dpt[table[i].to]) { dpt[table[i].to]=dpt[x]+1; q[++r]=table[i].to; if(table[i].to==T) return true; } } return false; } int Dinic(int x,int flow) { int i,left=flow; if(x==T) return flow; for(i=head[x];i&&left;i=table[i].next) if(table[i].f&&dpt[table[i].to]==dpt[x]+1) { int temp=Dinic(table[i].to,min(left,table[i].f) ); if(!temp) dpt[table[i].to]=-1; left-=temp; table[i].f-=temp; table[i^1].f+=temp; } return flow-left; } int main() { int i,j,x; cin>>n; for(i=1;i<n;i++) { scanf("%d",&m); for(j=1;j<=m;j++) scanf("%d",&x),Link(i,x,i==1||x==n?1:INF); } while( BFS() ) ans+=Dinic(S,INF); cout<<ans<<endl; return 0; }
BZOJ 2929 Poi1999 洞穴攀行 最大流
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。