SGU 194 Reactor Cooling ——网络流

【题目分析】

无源汇上下界可行流。

上下界网络流的问题可以参考这里。↓

http://www.cnblogs.com/kane0526/archive/2013/04/05/3001108.html

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

//#include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 205
#define me 50005
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)

void Finout()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    #endif
}

int Getint()
{
    int x=0,f=1; char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}

int h[me<<1],to[me<<1],ne[me<<1],fl[me<<1],en=0,S=0,T=me-1;
int id[me<<1];

void add(int a,int b,int c,int ID)
{
//	cout<<"add "<<a<<" "<<b<<" "<<c<<endl;
    to[en]=b; ne[en]=h[a]; fl[en]=c; id[en]=ID; h[a]=en++;
    to[en]=a; ne[en]=h[b]; fl[en]=0; id[en]=0; h[b]=en++;
}

int map[me];

bool tell()
{
    queue <int> q;
    memset(map,-1,sizeof map);
    map[S]=0;
    while (!q.empty()) q.pop();
    q.push(S);
    while (!q.empty())
    {
        int x=q.front(); q.pop();
//        cout<<"bfs"<<x<<endl;
        for (int i=h[x];i>=0;i=ne[i])
        {
//        	cout<<"to "<<to[i]<<endl;
            if (map[to[i]]==-1&&fl[i]>0)
            {
                map[to[i]]=map[x]+1;
                q.push(to[i]);
            }
        }
    }
//    cout<<"over"<<endl;
    if (map[T]!=-1) return true;
    return false;
}

int zeng(int k,int r)
{
    if (k==T) return r;
    int ret=0;
    for (int i=h[k];i>=0&&ret<r;i=ne[i])
        if (map[to[i]]==map[k]+1&&fl[i]>0)
        {
            int tmp=zeng(to[i],min(fl[i],r-ret));
            ret+=tmp; fl[i]-=tmp; fl[i^1]+=tmp;
        }
    if (!ret) map[k]=-1;
    return ret;
}

int ans[me<<1],n,m,du[me<<1],dn[me<<1];

int main()
{
    Finout();
    while (scanf("%d%d",&n,&m)!=EOF)
    {
    	memset(h,-1,sizeof h);
    	memset(ans,0,sizeof ans);
    	memset(du,0,sizeof du);
    	memset(dn,0,sizeof dn);
    	F(i,1,m)
    	{
    		int a,b,c,d;
    		a=Getint();b=Getint();c=Getint();d=Getint();
    		add(a,b,d-c,i);
    		du[a]-=c; du[b]+=c; dn[i]+=c;
		}
		F(i,1,n)
		{
			if (du[i]) add(S,i,du[i],0);
			if (du[i]<0) add(i,T,-du[i],0);
		}
		int now=0,tmp=0;
		while (tell()) while (tmp=zeng(S,inf)) now+=tmp;
		int flag=1;
		for (int i=h[S];i>=0;i=ne[i])
			if (fl[i]>0) flag=0;
		if (!flag) printf("NO\n");
		else
		{
			printf("YES\n");
			F(i,0,en-1) ans[id[i]]=fl[i^1];
			F(i,1,m) printf("%d\n",ans[i]+dn[i]);
		}
	}
}

  

时间: 2024-10-24 15:23:22

SGU 194 Reactor Cooling ——网络流的相关文章

SGU 194 Reactor Cooling 带容量上下限制的网络流

建立虚拟的源点和汇点,因为忽略掉了容量下界之后会导致流量不平衡,所以对于每个u,v,u多出来的流量流到汇点,v不够的流量从源点补流 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <ma

SGU 194. Reactor Cooling(无源汇有上下界的网络流)

时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 */ #include <iostream> #include <cstring> #define ms(a,b) memset(a,b,sizeof a) using namespace std; const int MAXN = 209; struct node { int u, v

SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的最大流

题目链接 题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的大小至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少? 思路:一般求解的网络流并不考虑下界问题,即流量可以为0,在有下界时,我们只需将上界变成r-l,这时还需要满足流量守恒,增加源点s和汇点t,当点u的流入大于流出时,将点u与s连边,容量即为多出的流量.同理当u流出大于流入时,多出来的流出的流量连到汇点t;直接跑最大流: 注:这时判断是否存在可行解时,是看连到源点的所有边是否满流,全为满流说明内部流

SGU 194 Reactor Cooling (有容量和下界的可行流)

题意:给定上一个有容量和下界的网络,让你求出一组可行解. 析:先建立一个超级源点 s 和汇点 t ,然后在输入时记录到每个结点的下界的和,建边的时候就建立c - b的最后再建立 s 和 t , 在建立时,如果 i 结点的输入的大于输出的,那么就是从 s 建立一条边,否则 i 与 t 建立,然后跑一次最大流,就OK了,注意求出的流量是没有下界,再加上下界的就好了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000")

sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)

[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] 无源无汇可行流要求所有的顶点都满足流量平衡. 基本思路是转化成最大流来做. 对于边(u,v,b,c),连边(u,v,c-b).为了保持流量平衡,我们还需要连边         1.(S,u,inB[u]-outB[u])  inB>outB 2.(u,T,outB[u]-inB[u])  outB>

SGU 194 Reactor Cooling

没有源点和汇点.流量有上下界的网络最大流问题. 今天看了一下午的有上下界的网络最大流问题,在似懂非懂.非常朦胧的状态下过了这个题...激动了半天. 求解的方法:http://www.cnblogs.com/zufezzt/p/4681035.html AC代码: #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<vector> #include

zoj 2314 Reactor Cooling 网络流

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear reactor to produce plutonium for the nuclear bomb they are planning to create. Be

sgu 194上下界网络流

又搞了个模板,这个模板应该ok,足以应付各种网络流了 题意:给n个点m 条边,其中每条边的流量有两个限制不能大于r不能小于l,求是否有可行解,如有输出每条边的流量 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 1000000; const int oo = 0x3777777; st

sgu 194 上下界网络流可行流判定+输出可行流

1 #include <cstdio> 2 #include <cstring> 3 #define min(a,b) ((a)<(b)?(a):(b)) 4 #define oo 0x3f3f3f3f 5 #define N 210 6 #define M 100010 7 8 struct Dinic { 9 int n, src, dst; 10 int head[N], dest[M], flow[M], eid[M], next[M], etot; 11 int c