有源汇的上下界最小流模板
来源:互联网 发布:淘宝最低价 编辑:程序博客网 时间:2024/05/22 08:18
#include<stdio.h>#include<iostream>#include<algorithm>#include<vector>#include<string.h>#include<queue>#define LL int#define inf 100000000#define maxn 150using namespace std;struct pi{ int to; int cost; int rev; int id;}pp;vector<pi >g[maxn];queue<int>q;int s,t;int line[maxn],leve[maxn];int min(int a,int b){ int p; p=a; if(b<a) p=b; return p;}void add(int a,int b,int cos,int id){ pp.to=b; pp.cost=cos; pp.rev=(int)g[b].size(); pp.id=id; g[a].push_back(pp); pp.to=a; pp.cost=0; pp.rev=(int)g[a].size()-1; pp.id=-1; g[b].push_back(pp); return ;}void bfs(void){ q.push(s); int p,f,i; while(!q.empty()) { p=q.front(); q.pop(); f=(int)g[p].size(); for(i=0;i<f;i++) { pi &e=g[p][i]; if(e.cost>0&&line[e.to]<0) { line[e.to]=line[p]+1; q.push(e.to); } } } return ;}int dfs(int v,int f){ int p; if(v==t) return f; for(int &i=leve[v];i<g[v].size();i++) { pi &e=g[v][i]; if(line[v]<line[e.to]&&e.cost>0) { p=dfs(e.to,min(f,e.cost)); if(p>0) { e.cost-=p; g[e.to][e.rev].cost+=p; return p; } } } return 0;}LL dinic(){ int f; LL flow=0; while(1) { memset(line,-1,sizeof(line)); memset(leve,0,sizeof(leve)); line[s]=0; bfs(); if(line[t]<0) return flow; f=dfs(s,inf); if(f==0) continue; flow+=f; while((f=dfs(s,inf))>0) { flow+=f; } }}struct ppi{ int from; int to; int a; int b;}pp1[100005];char c[1005];int a[105];int b[100005];int main(){ int i,j,n,m,p,k,N=0,le,ri,mid; while(scanf("%d%d",&n,&m)!=EOF){ memset(a,0,sizeof(a)); for(i=0;i<=n+1;i++) g[i].clear(); for(i=0;i<m;i++){ scanf("%d%d%d",&pp1[i].from,&pp1[i].to,&pp1[i].b); scanf("%d",&p); if(p==0){ pp1[i].a=0; } else pp1[i].a=pp1[i].b; a[pp1[i].from]+=pp1[i].a; a[pp1[i].to]-=pp1[i].a; } s=0; t=n+1; le=0; ri=1000000000; while(le<=ri){//将t-》s连一条有上界的边,二分上界。 mid=(le+ri)/2; for(i=0;i<=t;i++) g[i].clear(); for(i=0;i<m;i++){ add(pp1[i].from,pp1[i].to,pp1[i].b-pp1[i].a,i); } for(i=1;i<=n;i++){ if(a[i]==0) continue; if(a[i]>0) add(i,t,a[i],-1); else add(s,i,-a[i],-1); } add(n,1,mid,-1); dinic(); p=0; k=g[s].size(); for(i=0;i<k;i++){ if(g[s][i].cost!=0){ p=1; break; } } if(p) le=mid+1; else ri=mid-1; } if(le>=1000000000){ printf("Impossible\n"); } else{ printf("%d\n",le); for(i=0;i<=t;i++) g[i].clear(); for(i=0;i<m;i++){ add(pp1[i].from,pp1[i].to,pp1[i].b-pp1[i].a,i); } for(i=1;i<=n;i++){ if(a[i]==0) continue; if(a[i]>0) add(i,t,a[i],-1); else add(s,i,-a[i],-1); } add(n,1,le,-1); dinic(); for(i=1;i<=n;i++){ k=g[i].size(); for(j=0;j<k;j++){ if(g[i][j].id!=-1){ b[g[i][j].id]=pp1[g[i][j].id].b-g[i][j].cost; } } } for(i=0;i<m;i++){ if(i==0) printf("%d",b[i]); else printf(" %d",b[i]); } printf("\n"); } }}
0 0
- 有源汇的上下界最小流模板
- hdu3157 有源汇上下界最小流
- SGU 176 有源汇上下界的最小流
- sgu 176 有源汇有上下界的最小流模板题
- ★ SGU 176 有源汇上下界最小流
- HDU 3157 有源汇上下界最小流
- SGU 176 有源汇上下界最小流
- sgu176. Flow construction 有源汇上下界最小流
- 2502: 清理雪道 有源汇上下界最小流
- 【sgu176】Flow construction 有源汇上下界最小流
- SGU 176 Flow construction 有源汇 有上下界的最小流
- POJ 3801 Crazy Circuits 有源汇的上下界最小流
- Crazy Circuits poj 3801 有有源汇,上下界的最小流
- 有源汇点有上下界的最小流
- POJ 2396 - Budget 有源汇的上下界可行流
- 3698: XWW的难题 有源汇上下界最大流
- 【POJ2396】Budget(有源汇的上下界可行流)
- SGU 176 有源汇有上下界最小流(模板)
- Ubuntu中的ping命令
- 上下限网络流模板
- Oracle 跨库 查询 复制表数据
- C#数字图像处理<九>
- 程序员提高效率的十个工具
- 有源汇的上下界最小流模板
- android常用工具类 获取本机ip地址
- htmlspecialchars和htmlentities的区别
- Android TraceView工具使用
- ios-AutoLayout(自动布局代码控制)简单总结
- 后缀数组罗穗蹇模板(dc3)
- 《Windows32 SDK教程》09章 鼠标消息处理
- BnWCsWHugi
- 内存拷贝memcpy()和填充函数memset()