sgu-194-Reactor Cooling(无源汇有上下界最大流)
2013-06-05 18:16
537 查看
题意:
给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质。并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li。
分析:无源汇有上下界的最大流
建图:
以前写的最大流默认的下界为0,而这里的下界却不为0,所以我们要进行再构造让每条边的下界为0,这样做是为了方便处理。对于每根管子有一个上界容量up和一个下界容量low,我们让这根管子的容量下界变为0,上界为up-low。可是这样做了的话流量就不守恒了,为了再次满足流量守恒,即每个节点"入流=出流”,我们增设一个超级源点st和一个超级终点sd。我们开设一个数组du[]来记录每个节点的流量情况。
du[i]=in[i](i节点所有入流下界之和)-out[i](i节点所有出流下界之和)。
当du[i]大于0的时候,st到i连一条流量为du[i]的边。
当du[i]小于0的时候,i到sd连一条流量为-du[i]的边。
最后对(st,sd)求一次最大流即可,当所有附加边全部满流时(即maxflow==所有du[]>0之和),有可行解。
心得::妹的,数组又开小了!存边的容量下界dn[]数组开小了....!!!
给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质。并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li。
分析:无源汇有上下界的最大流
建图:
以前写的最大流默认的下界为0,而这里的下界却不为0,所以我们要进行再构造让每条边的下界为0,这样做是为了方便处理。对于每根管子有一个上界容量up和一个下界容量low,我们让这根管子的容量下界变为0,上界为up-low。可是这样做了的话流量就不守恒了,为了再次满足流量守恒,即每个节点"入流=出流”,我们增设一个超级源点st和一个超级终点sd。我们开设一个数组du[]来记录每个节点的流量情况。
du[i]=in[i](i节点所有入流下界之和)-out[i](i节点所有出流下界之和)。
当du[i]大于0的时候,st到i连一条流量为du[i]的边。
当du[i]小于0的时候,i到sd连一条流量为-du[i]的边。
最后对(st,sd)求一次最大流即可,当所有附加边全部满流时(即maxflow==所有du[]>0之和),有可行解。
心得::妹的,数组又开小了!存边的容量下界dn[]数组开小了....!!!
// File Name: 194.cpp // Author: Zlbing // Created Time: 2013/6/5 10:14:56 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define LL long long #define REP(i,r,n) for(int i=r;i<=n;i++) #define RREP(i,n,r) for(int i=n;i>=r;i--) const int MAXN=500; struct Edge{ int from,to,cap,flow; }; bool cmp(const Edge& a,const Edge& b){ return a.from < b.from || (a.from == b.from && a.to < b.to); } struct Dinic{ int n,m,s,t; vector<Edge> edges; vector<int> G[MAXN]; bool vis[MAXN]; int d[MAXN]; int cur[MAXN]; void init(int n){ this->n=n; for(int i=0;i<=n;i++)G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap){ edges.push_back((Edge){from,to,cap,0}); edges.push_back((Edge){to,from,0,0});//当是无向图时,反向边容量也是cap,有向边时,反向边容量是0 m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS(){ CL(vis,0); queue<int> Q; Q.push(s); d[s]=0; vis[s]=1; while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow){ vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } int DFS(int x,int a){ if(x==t||a==0)return a; int flow=0,f; for(int& i=cur[x];i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0)break; } } return flow; } //当所求流量大于need时就退出,降低时间 int Maxflow(int s,int t,int need){ this->s=s;this->t=t; int flow=0; while(BFS()){ CL(cur,0); flow+=DFS(s,INF); if(flow>need)return flow; } return flow; } //最小割割边 vector<int> Mincut(){ BFS(); vector<int> ans; for(int i=0;i<edges.size();i++){ Edge& e=edges[i]; if(vis[e.from]&&!vis[e.to]&&e.cap>0)ans.push_back(i); } return ans; } void Reduce(){ for(int i = 0; i < edges.size(); i++) edges[i].cap -= edges[i].flow; } void ClearFlow(){ for(int i = 0; i < edges.size(); i++) edges[i].flow = 0; } }; Dinic solver; int du[MAXN],dn[MAXN*MAXN>>1]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int st=n+1,et=n+2; solver.init(n+2); int a,b,c,d; CL(dn,0); CL(du,0); REP(i,0,m-1) { scanf("%d%d%d%d",&a,&b,&c,&d); solver.AddEdge(a,b,d-c); du[a]-=c; du[b]+=c; dn[i]=c; } int sumdu=0; REP(i,1,n) { if(du[i]>0)sumdu+=du[i]; if(du[i]>0)solver.AddEdge(st,i,du[i]); else if(du[i]<0)solver.AddEdge(i,et,-du[i]); } int flow=solver.Maxflow(st,et,INF); if(flow!=sumdu) { printf("NO\n"); continue; } printf("YES\n"); for(int i=0;i<m;i++){ printf("%d\n",solver.edges[i*2].flow+dn[i]); } } return 0; }
相关文章推荐
- 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 Reactor Cooling(无源无汇上下界可行流)
- SGU 194 Reactor Cooling 无源汇带上下界可行流
- sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)
- 【网络流】 SGU 194 Reactor Cooling 无源无汇上下界可行流(裸题)
- 【网络流】 SGU 194 Reactor Cooling 无源无汇上下界可行流(裸题)
- 最大流问题——无源汇有上下界最大流 sgu194 Reactor Cooling
- SGU194 Reactor Cooling 有下界最大流
- SGU 194 Reactor Cooling 无源汇带上下界可行流
- sgu194 无源汇上下界的最大流
- sgu194 Reactor Cooling【无源汇有上下界可行流】
- sgu 194 上下界最大流 此代码SGU瞬间过,ZOJ瞬间WA
- SGU 194 无源无汇上下界网络流
- SGU 194 Reactor Cooling (有容量和下界的可行流)
- zoj2314 Reactor Cooling (无源汇的有上下界的最大流)