好久沒a的這麼舒暢了。。第一次寫居然1a辣。。
part2:
有源匯上下界可行流
有源匯上下界可行流就是在多了源點和匯點,這樣導致除了源點和匯點外的其他店都流量守恆,我們可以從
t 向
s連一條容量為無窮大的邊,保證s,
t 也流量守恆,然後就可以轉化為無源匯上下界可行流做啦。
這題的建圖很直觀,行列建圖,每行連源點,每列連匯點,上下界均為su
mi,然後關於點(i
,j) 的操作就把第
i 行和第
j列連邊,根據操作確定上下界。然後直接跑有源匯上下界可行流就好辣。
#include
#include
#include
#define inf 1000000007
#define n 305
#define m 10005
using
namespace
std;
int head[n],cur[n],dis[n],q[n];
int next[m],list[m],key[m];
int n,m,q,s,t,ss,tt,cnt,tot,total;
int a[n],b[n],l[n][n],h[n][n],d[n];
bool flag;
inline
int read()
while (c>='0'&&c<='9')
return a*f;
}inline
void insert(int x,int y,int z)
inline
bool bfs()
return dis[tt]!=-1;
}int find(int x,int flow)
if (!used) dis[x]=-1;
return used;
}inline
int dinic()
return ans;
}inline
void update(int x,int y,int type,int num)
}int main()
int num=read();
if (!x&&!y)
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
update(i,j,type,num);
else
if (!x)
for (int i=1;i<=n;i++)
update(i,y,type,num);
else
if (!y)
for (int i=1;i<=m;i++)
update(x,i,type,num);
else update(x,y,type,num);
}for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
d[i]-=l[i][j],d[j+n]+=l[i][j];
for (int i=1;i<=n;i++)
d[i]+=a[i],d[s]-=a[i];
for (int i=1;i<=m;i++)
d[t]+=b[i],d[i+n]-=b[i];
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
insert(i,j+n,h[i][j]-l[i][j]),insert(j+n,i,0);
insert(t,s,inf); insert(s,t,0);
for (int i=s;i<=t;i++)
if (d[i]>0) total+=d[i],insert(ss,i,d[i]),insert(i,ss,0);
else
if (d[i]<0) insert(i,tt,-d[i]),insert(tt,i,0);
if (dinic()!=total)
else
puts("");
}puts("");
}return
0;}
POJ2396 Budget 上下界網路流
表示弱看了半天才能勉強看懂啊。為什麼有上下界會流量不守恆,可以看這篇文章,裡面有證明。嗯。如果理解了原理的話,這題應該算是乙個入門題了吧。要注意的地方就是,因為給的條件有大於和小於,所以更新low和up的時候用cap 1,cap 1,而不是cap。調了好久才發現的。include include i...
poj2396 Budget 上下界可行流
budget 題意 給定乙個棋盤,給定每一行每一列的和,還有每個點的性質。求乙個合理的棋盤數值放置方式。思路 比較經典的網路流模型,把每一列看成乙個點,每一行看成乙個點,利用上下界可行流的思路建圖就行了,注意這裡由於是嚴格的小於和大於,所以可以利用 x 1,x 1。還有就是這道題的0 0 說的是對整...
POJ 2396 Budget 有上下限的最大流
題意 輸入的第一行是測試資料的個數。每組測試資料的第一行是n和m。第二行是n個數,表示n行的和,第三行是m個數,表示m列的和。接下來乙個k,表示有以下k個限制,每個限制的形式x y z w,其中z是 或者 表示第x行第y列的元素和w的大小關係。假如z是 那麼說明第x行第y列的元素必須大於w。如果x是...