上下界网络流模板
无源汇上下界可行流
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<stack> 9 #include<set> 10 #include<bitset> 11 #include<vector> 12 #include<cstdlib> 13 #define QAQ int 14 #define TAT long long 15 #define OwO bool 16 #define ORZ double 17 #define F(i,j,n) for(QAQ i=j;i<=n;++i) 18 #define E(i,j,n) for(QAQ i=j;i>=n;--i) 19 #define MES(i,j) memset(i,j,sizeof(i)) 20 #define MEC(i,j) memcpy(i,j,sizeof(j)) 21 22 using namespace std; 23 const QAQ N=305,M=30000; 24 25 QAQ n,m,s,t; 26 struct Link{ 27 QAQ to,last,val,id; 28 }a[M]; 29 QAQ head[N],js=1; 30 QAQ dis[N],use[N],ans[M]; 31 QAQ low[M],flow[N]; 32 OwO vis[N]; 33 queue<QAQ> q; 34 35 void add(QAQ x,QAQ y,QAQ z,QAQ p){ 36 a[++js].to=y;a[js].id=p;a[js].val=z; 37 a[js].last=head[x];head[x]=js; 38 } 39 40 OwO bfs(){ 41 F(i,s,t) dis[i]=vis[i]=0; 42 dis[s]=vis[s]=1; 43 q.push(s); 44 while(!q.empty()){ 45 QAQ x=q.front();q.pop(); 46 for(QAQ i=head[x];i;i=a[i].last) if(a[i].val&&!vis[a[i].to]){ 47 vis[a[i].to]=1; 48 dis[a[i].to]=dis[x]+1; 49 q.push(a[i].to); 50 } 51 } 52 return vis[t]; 53 } 54 55 QAQ dfs(QAQ x,QAQ want){ 56 if(x==t||!want) return want; 57 QAQ f=0,ans=0; 58 for(QAQ i=use[x];i;i=a[i].last) if(dis[a[i].to]==dis[x]+1){ 59 f=dfs(a[i].to,min(a[i].val,want)); 60 if(!f) continue; 61 ans+=f; 62 want-=f; 63 a[i].val-=f; 64 a[i^1].val+=f; 65 if(!want) break; 66 use[x]=i; 67 } 68 if(!ans) dis[x]=-1; 69 return ans; 70 } 71 72 QAQ dinic(){ 73 QAQ ans=0; 74 while(bfs()){ 75 MEC(use,head); 76 ans+=dfs(s,1e9); 77 } 78 return ans; 79 } 80 81 QAQ main(){ 82 scanf("%d%d",&n,&m); 83 s=0;t=n+1; 84 F(i,1,m){ 85 QAQ u,v,w; 86 scanf("%d%d%d%d",&u,&v,&low[i],&w); 87 add(u,v,w-low[i],i); 88 add(v,u,0,i); 89 flow[v]+=low[i]; 90 flow[u]-=low[i]; 91 } 92 QAQ sum=0; 93 F(i,1,n) if(flow[i]<0){ 94 add(i,t,-flow[i],0); 95 add(t,i,0,0); 96 } 97 else { 98 sum+=flow[i]; 99 add(s,i,flow[i],0); 100 add(i,s,0,0); 101 } 102 if(dinic()==sum){ 103 printf("YES "); 104 F(x,1,n) for(QAQ i=head[x];i;i=a[i].last) if(a[i].id==0||i%2==0) continue; 105 else { 106 ans[a[i].id]=a[i].val+low[a[i].id]; 107 } 108 F(i,1,m) printf("%d ",ans[i]); 109 } 110 else printf("NO "); 111 return 0; 112 }
有源汇有上下界最大流
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<stack> 9 #include<set> 10 #include<bitset> 11 #include<vector> 12 #include<cstdlib> 13 #define QAQ int 14 #define TAT long long 15 #define OwO bool 16 #define ORZ double 17 #define F(i,j,n) for(QAQ i=j;i<=n;++i) 18 #define E(i,j,n) for(QAQ i=j;i>=n;--i) 19 #define MES(i,j) memset(i,j,sizeof(i)) 20 #define MEC(i,j) memcpy(i,j,sizeof(j)) 21 22 using namespace std; 23 const QAQ N=405,M=30000; 24 25 QAQ n,m,s,t,ss,tt; 26 struct Link{ 27 QAQ to,last,val,id; 28 }a[M]; 29 QAQ head[N],js=1; 30 QAQ dis[N],use[N],ans[M]; 31 QAQ low[M],flow[N]; 32 OwO vis[N]; 33 queue<QAQ> q; 34 35 void add(QAQ x,QAQ y,QAQ z,QAQ p){ 36 a[++js].to=y;a[js].id=p;a[js].val=z; 37 a[js].last=head[x];head[x]=js; 38 } 39 40 OwO bfs(){ 41 F(i,0,n+1) dis[i]=vis[i]=0; 42 dis[ss]=vis[ss]=1; 43 q.push(ss); 44 while(!q.empty()){ 45 QAQ x=q.front();q.pop(); 46 for(QAQ i=head[x];i;i=a[i].last) if(a[i].val&&!vis[a[i].to]){ 47 vis[a[i].to]=1; 48 dis[a[i].to]=dis[x]+1; 49 q.push(a[i].to); 50 } 51 } 52 return vis[tt]; 53 } 54 55 QAQ dfs(QAQ x,QAQ want){ 56 if(x==tt||!want) return want; 57 QAQ f=0,ans=0; 58 for(QAQ i=use[x];i;i=a[i].last) if(dis[a[i].to]==dis[x]+1){ 59 f=dfs(a[i].to,min(a[i].val,want)); 60 if(!f) continue; 61 ans+=f; 62 want-=f; 63 a[i].val-=f; 64 a[i^1].val+=f; 65 if(!want) break; 66 use[x]=i; 67 } 68 if(!ans) dis[x]=-1; 69 return ans; 70 } 71 72 QAQ dinic(){ 73 QAQ ans=0; 74 while(bfs()){ 75 MEC(use,head); 76 ans+=dfs(ss,1e9); 77 } 78 return ans; 79 } 80 81 QAQ main(){ 82 scanf("%d%d%d%d",&n,&m,&s,&t); 83 ss=0;tt=n+1; 84 F(i,1,m){ 85 QAQ u,v,w; 86 scanf("%d%d%d%d",&u,&v,&low[i],&w); 87 add(u,v,w-low[i],i); 88 add(v,u,0,i); 89 flow[v]+=low[i]; 90 flow[u]-=low[i]; 91 } 92 QAQ sum=0; 93 F(i,1,n) if(flow[i]<0){ 94 add(i,tt,-flow[i],0); 95 add(tt,i,0,0); 96 } 97 else { 98 sum+=flow[i]; 99 add(ss,i,flow[i],0); 100 add(i,ss,0,0); 101 } 102 add(t,s,1e9,0); 103 if(dinic()==sum){ 104 sum=a[head[t]^1].val; 105 F(i,2,js) if(!a[i].id) a[i].val=0; 106 head[ss]=head[tt]=0; 107 ss=s;tt=t; 108 printf("%d ",sum+dinic()); 109 } 110 else printf("please go home to sleep "); 111 return 0; 112 }