您的位置:首页 > 其它

BZOJ 2929:[Poi1999]洞穴攀行

2016-05-13 15:16 441 查看
翻译的一手好题。。

mdzz我特么做半天不对看题解又想不通。。

然后是某位神犇告诉我翻译错了。。

然后打了七八分钟的模板就交了。。

裸的网络流,原题的一思是起点和终点的边只能走一次,那么就把那几条边的流量弄成1就行了

呣唔

代码:

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<complex>
#include<cstring>
#include<iostream>
#include<algorithm>
#define g getchar()
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
ll x=0,f=1;char ch=g;
for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0';
return x*f;
}
inline void out(ll x){
int a[25],t=0;
if(x<0)putchar('-'),x=-x;
for(;x;x/=10)a[++t]=x%10;
for(int i=t;i;--i)putchar('0'+a[i]);
if(t==0)putchar('0');
putchar('\n');
}
struct re{int v,fl,next;}ed[40005];
int dep[205],dui[205],head[205],n,ans,e=1;
inline void ins(int x,int y,int fl){
ed[++e]=(re){y,fl,head[x]};head[x]=e;
ed[++e]=(re){x,0,head[y]};head[y]=e;
}
bool bfs(){
int tou=1,wei=1;
memset(dep,-1,sizeof(dep));
dep[1]=0;dui[1]=1;
for(;tou<=wei;++tou){
int u=dui[tou];
for(int i=head[u];i;i=ed[i].next)
if(ed[i].fl&&dep[ed[i].v]==-1)
dep[ed[i].v]=dep[u]+1,dui[++wei]=ed[i].v;
}
return dep
!=-1;
}
int dfs(int x,int fl){
if(x==n)return fl;
int used=0;
for(int i=head[x];i;i=ed[i].next)
if(ed[i].fl&&dep[ed[i].v]==dep[x]+1){
int w=dfs(ed[i].v,min(fl-used,ed[i].fl));
used+=w;
ed[i].fl-=w;ed[i^1].fl+=w;
if(used==fl)return fl;
}
if(!used)dep[x]=-1;
return used;
}
void dinic(){for(;bfs();)ans+=dfs(1,inf);}
int main(){
n=read();
for(int i=0;++i<n;){
int m=read();
for(int j=1;j<=m;++j){
int x=read();
if(x==n||i==1)ins(i,x,1);
else ins(i,x,inf);
}
}
dinic();
out(ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: