做法:
1、有源彙編成無源匯 (t-s, 0, infmax)
2、ss tt 連線個點 intout>0(ss-i,0,inout[i]) inout<0 (i, tt, 0, -inout[i])
3、然後跑一片最大流 max=dinic(ss,tt) 之後的這步很重要 head[ss]=head[tt]=-1//刪除ss 和 tt
4、if( max == sum ) 成立有解 不成立無解 sum=所有ss流出的流量總和
5、在跑一邊最大流 maxflow=dinic(s,t) 最大流 maxflow 各個邊的流量輸出見**
zoj 3229
/** this code is made by linmeichen
* problem:
* type of problem: 有源匯上下界最大流
* thinking:
* feeling:
*/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long lld;
typedef unsigned int ud;
#define inf_max 0x3f3f3f3f
#define eatline() char chch;while((chch=getchar())!='\n')continue;
#define memsetmax(a) memset(a,0x3f,sizeof a)
#define memsetzero(a) memset(a,0,sizeof a)
#define memsetmin(a) memset(a,-1,sizeof a)
#define memsetfalse(a) memsetzero(a)
#define pq priority_queue
#define q queue
#define maxn 1400
#define maxm 400008
struct edge
e[maxm<<2];
int k, cnt;
int head[maxn], h[maxn];
int level[maxn], stack[maxn];
int inout[maxn], low[maxn];
int g[maxn], d[maxn];
bool bfs(int s, int t)}}
return false;
}int dinic(int s, int t)
}for (int i = 0; i < top; i++)
top = flag;
maxflow += minflow;
u = e[stack[top] ^ 1].v;
}for (int i = h[u]; i != -1; i = h[u] = e[i].next)
if (h[u] != -1)
else}}
return maxflow;
}void add_edge(int u, int v, int f1, int f2 = 0)
int main()
}for (int i = 1; i <= n; i++)
for (int i = 1; i <= m; i++)
int sum = 0;
for (int i = 1; i <= t; i++)
add_edge(t, s, inf_max);
if (sum!=dinic(ss, tt))
printf("-1\n");
else
}puts("");
}return 0;
}
有源匯上下界最大流
a 有源匯有上下界最大流 libreoj 116 給定乙個包含 n 個點 m 條邊的有向圖,每條邊都有乙個流量下界和流量上界。給定源點 s和匯點 t,求源點到匯點的最大流。輸入格式 第一行包含四個整數 n,m,s,t。接下來 m行,每行包含四個整數 a,b,c,d 表示點 a 和 b 之間存在一條有...
有源匯上下界最大流
題目描述 這是一道模板題。n n n 個點,m m m 條邊,每條邊 e e e 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s s s 與匯點 t t t,求源點到匯點的最大流。輸入格式 第一行兩個正整數 n n...
有源匯的上下界最大流
主要由兩種做法 1 二分乙個流量,然後跑乙個最大流,看有沒有能滿足的可行流,能滿足的流量的最大值就是答案了,複雜度 單次網路流複雜度 log最大流量 反之我是不想寫這個的,感覺寫起很麻煩,而且二分的邊界也不好調 看方法二就可以了 2 首先無論如何我們都需要先跑一次可行流的 不然連能不能流通都不知道 ...