设为首页 加入收藏

TOP

有源汇上下界最大(小)流(二)
2019-02-10 18:08:02 】 浏览:215
Tags:有源 上下 最大
nxt = head[u];head[u] = ejs; e[++ejs].v = u;e[ejs].w = 0;e[ejs].nxt = head[v];head[v] = ejs; } int dep[N]; queue<int>q; int S,T; int low[N],rd[N],cd[N],ans,cur[N]; int bfs() { memset(dep,0,sizeof(dep)); while(!q.empty()) q.pop(); dep[S] = 1;q.push(S); while(!q.empty()) { int u = q.front();q.pop(); for(int i = head[u];i;i = e[i].nxt) { int v = e[i].v; if(!dep[v] && e[i].w) { q.push(v); dep[v] = dep[u] + 1; if(v == T) return 1; } } } return 0; } int dfs(int u,int now) { if(u == T) return now; int ret = 0; for(int &i = cur[u];i;i = e[i].nxt) { int v = e[i].v; if(dep[v] == dep[u] + 1 && e[i].w) { int k = dfs(v,min(now - ret,e[i].w)); e[i].w -= k; e[i ^ 1].w += k; ret += k; if(now == ret) return ret; } } return ret; } int dinic() { int ans = 0; while(bfs()) { memcpy(cur,head,sizeof(cur)); ans += dfs(S,INF); } return ans; } int main() { int n = read(),m = read(); int SS = read(),TT = read(); add(TT,SS,INF); S = n + 1,T = S + 1; for(int i = 1;i <= m;++i) { int u = read(),v = read(),low = read(), up = read(); add(u,v,up - low); rd[v] += low; cd[u] += low; } for(int i = 1;i <= n;++i) { int d = rd[i] - cd[i]; if(d > 0) ans += d,add(S,i,d); if(d < 0) add(i,T,-d); } if(ans != dinic()) { puts("please go home to sleep"); return 0; } for(int i = head[S];i;i = e[i].nxt) e[i].w = e[i ^ 1].w = 0; for(int i = head[T];i;i = e[i].nxt) e[i].w = e[i ^ 1].w = 0; ans = e[3].w; e[3].w = e[2].w = 0; S = TT;T = SS;//!!! ans -= dinic();//!!! cout<<ans; return 0; }
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇L1-020 帅到没朋友 下一篇poj1637 Sightseeing tour(混合图..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目