标签:[1] online har amp mes zoj iostream etc ==
最大流模版题。。。
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=2929
与起点或终点连接的边流量可以无限大,其他边流量最大为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.
标签:[1] online har amp mes zoj iostream etc ==
原文地址:http://www.cnblogs.com/Yuigahama/p/7738369.html