hdu 3452 最小割 树形dp(二)

2014-11-24 10:32:28 · 作者: · 浏览: 2
int _next,int _to,int _cap){ next=_next;to=_to;cap=_cap; } }edge[maxm]; int head[maxn],tol,dep[maxn],gap[maxn]; void addedge(int u,int v,int flow){ edge[tol]=Edge(head[u],v,flow);head[u]=tol++; edge[tol]=Edge(head[v],u,0);head[v]=tol++; } void bfs(int start,int end){ memset(dep,-1,sizeof(dep)); memset(gap,0,sizeof(gap)); gap[0]++;int front=0,rear=0,Q[maxn]; dep[end]=0;Q[rear++]=end; while(front!=rear){ int u=Q[front++]; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to;if(dep[v]==-1) Q[rear++]=v,dep[v]=dep[u]+1,gap[dep[v]]++; } } } int sap(int s,int t,int N){ int res=0;bfs(s,t); int cur[maxn],S[maxn],top=0,u=s,i; memcpy(cur,head,sizeof(head)); while(dep[s] edge[S[i]].cap) temp=edge[S[i]].cap,id=i; for( i=0;i dep[edge[i].to]) MIN=dep[edge[i].to],cur[u]=i; --gap[dep[u]];++gap[dep[u]=MIN+1]; if(u!=s)u=edge[S[--top]^1].to; } } return res; } int in[maxn]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n,r; while(~scanf("%d%d",&n,&r)&&(n||r)){ memset(head,-1,sizeof(head));tol=0; int sum=0; memset(in,0,sizeof(in)); for(int i=1;i