【有上下界网络流+费用流多路增广】【bzoj 3876】: [Ahoi2014]支线剧情
2015-01-20 19:52
441 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=3876
这题几乎显然的网络流
学习了有上下界网络流的写法
按照ZYF的代码实现了贴吧中所说费用流多路增广优化
看起来要用bitset,就写了一个。。。
ybzx有特殊的建图技巧,由于没看懂,我也没法解释
由于他太SXBK,刷了一页刷到了rank 1
这题几乎显然的网络流
学习了有上下界网络流的写法
按照ZYF的代码实现了贴吧中所说费用流多路增广优化
看起来要用bitset,就写了一个。。。
ybzx有特殊的建图技巧,由于没看懂,我也没法解释
由于他太SXBK,刷了一页刷到了rank 1
//#define _TEST _TEST #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <bitset> using namespace std; /************************************************ Code By willinglive Blog:http://willinglive.cf ************************************************/ #define rep(i,l,r) for(int i=(l),___t=(r);i<=___t;i++) #define per(i,r,l) for(int i=(r),___t=(l);i>=___t;i--) #define MS(arr,x) memset(arr,x,sizeof(arr)) #define LL long long #define INE(i,u,e) for(int i=head[u];~i;i=e[i].next) inline const int read() {int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1; for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;} ///////////////////////////////////////////////// const int N=333,M=100000; const int inf=0x3f3f3f3f; int n; struct edge{int v,cap,flow,cost,next;}e[M*2]; int head ,k; int S,T,SS,TT; int dis ,pre ; bitset<N>vis; ///////////////////////////////////////////////// inline int F(int i){return e[i].cap-e[i].flow;} void adde(int u,int v,int f,int c) {e[k].v=v;e[k].flow=0;e[k].cap=f;e[k].cost=c;e[k].next=head[u];head[u]=k++;} void ins(int u,int v,int f,int c){adde(u,v,f,c); adde(v,u,0,-c);} void insert(int u,int v,int l,int r,int c) { if(l) ins(SS,v,l,c), ins(u,TT,l,0); ins(u,v,r-l,c); } bool spfa() { static bool inq ; static queue<int>q; MS(dis,inf); q.push(S); dis[S]=0; while(!q.empty()) { int u=q.front(); q.pop(); inq[u]=0; INE(i,u,e) if(F(i)) { int v=e[i].v; if(dis[v]>dis[u]+e[i].cost) { dis[v]=dis[u]+e[i].cost; pre[v]=i; if(!inq[v]) q.push(v),inq[v]=1; } } } return dis[T]<inf; } int dfs(int u,int a) { vis[u]=1; if(u==T) return a; INE(i,u,e) if(!vis[e[i].v] && F(i) && dis[e[i].v]==dis[u]+e[i].cost) if(int t=dfs(e[i].v,min(a,F(i)))) return e[i].flow+=t,e[i^1].flow-=t,t; return 0; } int MCMF() { int c=0; while(spfa()) do { vis.reset(); c+=dfs(S,inf)*dis[T]; }while(vis[T]); return c; } ///////////////////////////////////////////////// void input() { MS(head,-1); n=read(); S=0,T=n+1; SS=n+2; TT=n+3; insert(S,1,0,inf,0); rep(u,1,n) { rep(i,1,read()) { int v=read(),c=read(); insert(u,v,1,inf,c); } insert(u,T,0,inf,0); } insert(T,S,0,inf,0); S=SS; T=TT; } void solve() { printf("%d\n",MCMF()); } ///////////////////////////////////////////////// int main() { #ifndef _TEST freopen("story.in","r",stdin); freopen("story.out","w",stdout); #endif input(),solve(); return 0; }
相关文章推荐
- 有下界的最小费用可行流2.0(bzoj 3876: [Ahoi2014]支线剧情)
- 【bzoj3876】[Ahoi2014]支线剧情 有上下界的费用流
- [BZOJ 3876][Ahoi2014]支线剧情:上下界网络流
- 【bzoj3876】【AHOI2014】【支线剧情】【有上下界的费用流】
- [bzoj3876][AHOI2014]支线剧情 有下界费用流
- [上下界费用流] BZOJ 3876 [Ahoi2014]支线剧情
- BZOJ-3876-支线剧情-Ahoi2014-上下界网络流
- BZOJ 3876: [Ahoi2014]支线剧情【下界费用流
- BZOJ-3876-支线剧情-Ahoi2014-上下界网络流
- 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情
- 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流
- BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流
- 【bzoj3876】[Ahoi2014]支线剧情 有上下界费用流
- BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]
- bzoj 3876: [Ahoi2014]支线剧情 (有上下界的费用流)
- BZOJ 3876([Ahoi2014]支线剧情-带下界的最小费用可行流)
- bzoj3876[AHOI2014]支线剧情(有上下界的费用流)
- [BZOJ3876][Ahoi2014]支线剧情(有源汇有上下界的费用流)
- [bzoj3876][AHOI2014]支线剧情——上下界费用流
- BZOJ 3876: [Ahoi2014]支线剧情(有源有汇有下界的费用流)