網路流 5 UVA 11082 最大流

2022-03-14 09:45:29 字數 2267 閱讀 7564

網路流題目最有意思的地方就是構圖了,畢竟套模板每個人都會的

現在有乙個矩陣,已知前i行元素之和a[i](1<=i<=n),前j列元素之和b[j](1<=j<=m),求乙個可行的矩陣,且矩陣每個元素在區間[1,20]內。

這也算是含上下界的網路流了,但是顯然,如果將每個元素都減一,就是普通的最大流了,矩陣元素值在區間[0,19]內。

首先求出第i行元素之和r[i],第j列元素之和c[j],

然後就是建圖,每行化為乙個結點1~n,每列化為乙個結點n+1~n+m

源點到1~n,分別連一條邊,容量為r[i]-m

n+1~n+m到匯點,分別連一條邊,容量為c[i]-n

1~n到n+1~n+m,分別連一條容量為19的邊

這樣跑一發網路流

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include8 #include9 #include10 #include11 #include

12 #include13

#define maxn 1000

14#define maxm 2000

15#define inf (1<<30)

16#define eps 0.000001

17#define all(x) x.begin(),x.end()

18#define ins(x) inserter(x,x.begin())

19using

namespace

std;

20const

int inf = 0x3f3f3f3f;21

inti,j,k,n,m,x,y,t,num,w,cas,s,t,maxflow,u;

22struct

edgenode

23edge[maxm];

27int

edge,head[maxn],ps[maxn],dep[maxn],r[maxn],c[maxn],tt;

28int

ans[maxn][maxn];

2930

void add_edge(int x,int y,int

c)31

44/*

關於這個模板:

45edge為前向星的邊數,所以需要初始化edge和head陣列

46n表示有n個點,這個版無所謂點從0開始還是從1開始,s表示源點,t表示匯點

47很好的乙個是,這個版的dfs使用的是模擬棧,防止爆棧

48*/

4950

int dinic(int n,int s,int

t)5168}

69}70}

71if(dep[t]==-1)break;72

73for(i=s,top=0;;)//

dfs部分

7486

87for(j=head[i];j!=-1;j=edge[j].next)//

找當前點所指向的點

88if(edge[j].cap&&dep[i]+1==dep[edge[j].to]) break;89

90if(j!=-1)91

95else

96101

}102

}103

return

res;

104}

105106

intmain()

107122 tt=n+m+1

; 123 pre=0

;124

for (i=1;i<=m;i++)

125130

for (i=1;i<=n;i++)

131136

}137

138 maxflow=dinic(tt+1,0

,tt);

139//

cout<140

for (i=1;i<=n;i++)

141148

}149 printf("

matrix %d\n

",cas);

150for (i=1;i<=n;i++)

151156 printf("

%d\n

",ans[i][m]+1

);157

}158

if (cas!=t) printf("\n"

);159

}160

return0;

161 }

view code

UVa11082 矩陣解壓 網路流學習

為什麼這樣是對的呢?這裡我自己還是沒分析出來,借用大佬們的思路吧。建邊容量的選擇 因為網路流中是允許0流的,所以我們將所有元素減1,對應每行之和就是減c,每列減r,中間最大容量就是0 19,輸出時加一即可。模型建立的選擇 這樣建模是常用的矩陣建模之一,學習學習 首先,每個x節點只有乙個入流,多個出流...

網路流 最大流

網路流 題記 網路流是最近講過的最迷演算法 網路流 network flows 是一種模擬水流的解決問題方法,與線性規劃密切相關。非常重視選手在網路流上的建模技巧,畫圖是非常關鍵的。1 最大流 問題引入 有n條溝渠,與水坑s t相連,匯聚成m個點,第i條溝渠的水流的流量為c i 每乙個點的流入量和流...

網路流(最大流)

我們圍繞一道題來講解吧 藍橋杯 演算法訓練 網路流裸題 首先,何為網路流最大流問題?可行流 對於每條路線 u,v 上給定乙個實數f u,v 滿足 0 f u,v c u,v 則稱f u,v 為路線 u,v 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...