SGU 194 Reactor Cooling(有上下限可行流)
2013-01-19 17:20
274 查看
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=194
题意:求一个可行流。
思路:方法:
(1)添加超级源点S和超级汇点T;
(2)对于原有的边(u,v,l(u,v),c(u,v))(l为流量下限,c为流量上限),添加边(u,v,c-l);
(3)对于每个结点i,记w[i]=sum(l(u,i))-sun(l(i,v)); 若w[i]>0,添加边(S,i,w[i]),若w[i]<0,添加边(i,T,-w[i]);
(4)求解S-T的最大流;
(5)当且仅当S的出边和T的入边满流,原流量限制的无源网络流可行流有解;
(6)一组可行流的解为: 对于每条流量边(u,v),可行流量为l(u,v)+其构造的图中的流量.
题意:求一个可行流。
思路:方法:
(1)添加超级源点S和超级汇点T;
(2)对于原有的边(u,v,l(u,v),c(u,v))(l为流量下限,c为流量上限),添加边(u,v,c-l);
(3)对于每个结点i,记w[i]=sum(l(u,i))-sun(l(i,v)); 若w[i]>0,添加边(S,i,w[i]),若w[i]<0,添加边(i,T,-w[i]);
(4)求解S-T的最大流;
(5)当且仅当S的出边和T的入边满流,原流量限制的无源网络流可行流有解;
(6)一组可行流的解为: 对于每条流量边(u,v),可行流量为l(u,v)+其构造的图中的流量.
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <set> #include <stack> #include <string> #include <map> #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define abs(x) ((x)>=0?(x):-(x)) #define i64 long long #define u32 unsigned int #define u64 unsigned long long #define clr(x,y) memset(x,y,sizeof(x)) #define CLR(x) x.clear() #define ph(x) push(x) #define pb(x) push_back(x) #define Len(x) x.length() #define SZ(x) x.size() #define PI acos(-1.0) #define sqr(x) ((x)*(x)) #define FOR0(i,x) for(i=0;i<x;i++) #define FOR1(i,x) for(i=1;i<=x;i++) #define FOR(i,a,b) for(i=a;i<=b;i++) #define DOW0(i,x) for(i=x;i>=0;i--) #define DOW1(i,x) for(i=x;i>=1;i--) #define DOW(i,a,b) for(i=a;i>=b;i--) using namespace std; void RD(int &x){scanf("%d",&x);} void RD(i64 &x){scanf("%I64d",&x);} void RD(u32 &x){scanf("%u",&x);} void RD(double &x){scanf("%lf",&x);} void RD(int &x,int &y){scanf("%d%d",&x,&y);} void RD(i64 &x,i64 &y){scanf("%I64d%I64d",&x,&y);} void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);} void RD(double &x,double &y){scanf("%lf%lf",&x,&y);} void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);} void RD(i64 &x,i64 &y,i64 &z){scanf("%I64d%I64d%I64d",&x,&y,&z);} void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);} void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);} void RD(char &x){x=getchar();} void RD(char *s){scanf("%s",s);} void RD(string &s){cin>>s;} void PR(int x) {printf("%d\n",x);} void PR(i64 x) {printf("%I64d\n",x);} void PR(u32 x) {printf("%u\n",x);} void PR(double x) {printf("%.4lf\n",x);} void PR(char x) {printf("%c\n",x);} void PR(char *x) {printf("%s\n",x);} void PR(string x) {cout<<x<<endl;} struct Node { int v,cap,flow,next; Node(){} Node(int _v,int _cap,int _next) { v=_v; cap=_cap; next=_next; } }; const int INF=1000000000; const int M=305; int num[M],h[M],curedge[M],pre[M]; int que[M]; Node edges[120005]; int n,m,s,t,head[M],e; void Add(int u,int v,int cap) { edges[e]=Node(v,cap,head[u]); head[u]=e++; edges[e]=Node(u,0,head[v]); head[v]=e++; } void BFS(int s,int t) { memset(num,0,sizeof(num)); memset(h,-1,sizeof(h)); num[0]=1; int front=0,rear=0; h[t]=0; que[rear++]=t; int u,v,i; while(front!=rear) { u=que[front++]; front=front%M; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; if(edges[i].cap!=0||h[v]!=-1) continue; que[rear++]=v; rear=rear%M; ++num[h[v]=h[u]+1]; } } } int Maxflow(int s,int t,int n) { int ans=0,i,k,x,d,u; BFS(s,t); for(i=0;i<=n;i++) curedge[i]=head[i]; num =n;u=s; while(h[u]<n) { if(u==t) { d=INF+1; for(i=s;i!=t;i=edges[curedge[i]].v) if(d>edges[curedge[i]].cap) k=i,d=edges[curedge[i]].cap; for(i=s;i!=t;i=edges[curedge[i]].v) { x=curedge[i]; edges[x].cap-=d; edges[x^1].cap+=d; } ans+=d;u=k; } for(i=curedge[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[u]==h[edges[i].v]+1) break; if(i!=-1) { curedge[u]=i; pre[edges[i].v]=u; u=edges[i].v; } else { if(--num[h[u]]==0) break; curedge[u]=head[u]; for(x=n,i=head[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[edges[i].v]<x) x=h[edges[i].v]; h[u]=x+1;num[h[u]]++; if(u!=s) u=pre[u]; } } return ans; } int a[205],b[20005]; int main() { clr(head,-1); e=0; RD(n,m); int i,u,v,L,R; FOR1(i,m) { RD(u,v); RD(L,R); Add(u,v,R-L); a[u]-=L; a[v]+=L; b[i]=L; } s=0;t=n+1; int x=0,y=0; FOR1(i,n) { if(a[i]<0) Add(i,t,-a[i]),x+=-a[i]; if(a[i]>0) Add(s,i,a[i]),y+=a[i]; } if(x==y&&Maxflow(s,t,t+1)==x) puts("YES"); else { puts("NO"); return 0; } FOR1(i,m) { printf("%d\n",b[i]+edges[(i-1)*2+1].cap); } return 0; }
相关文章推荐
- sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)
- sgu 194 Reactor Cooling 无源无汇上下限网络流
- SGU 194 Reactor Cooling 无源汇带上下界可行流
- SGU 194 Reactor Cooling (有容量和下界的可行流)
- SGU 194 Reactor Cooling 无源汇带上下界可行流
- sgu194 Reactor Cooling【无源汇有上下界可行流】
- SGU 194 Reactor Cooling(无源无汇上下界可行流)
- 【网络流】 SGU 194 Reactor Cooling 无源无汇上下界可行流(裸题)
- 【网络流】 SGU 194 Reactor Cooling 无源无汇上下界可行流(裸题)
- SGU 194 Reactor Cooling
- SGU 194带上下界的可行流。
- SGU 194 Reactor Cooling(无源汇有上下界最大流)
- sgu-194-Reactor Cooling(无源汇有上下界最大流)
- 【SGU194】Reactor Cooling 无源汇上下界可行流
- SGU - 194 Reactor Cooling(无源无汇有上下界最大流)
- SGU 194 Reactor Cooling-上下界网络流模板题
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
- sgu 194 被动散热器具有最大流量的上限和下限(最大流量模板dinic加上优化)
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
- SGU 194 Reactor Cooling