洛谷 P4014 分配問題

2022-05-08 20:12:05 字數 2061 閱讀 9121

題目鏈結

有n件工作要分配給n個人做.第i個人做第j件工作產生的效益為cij​.試設計乙個將n件工作分配給n個人做的分配方案,使產生的總效益最大.

檔案的第1行有1個正整數n,表示有n件工作要分配給n個人做. 接下來的n行中,每行有n個整數cij​,表示第i個人做第j件工作產生的效益為cij​.

兩行分別輸出最小總效益和最大總效益。

樣例輸入

522

2122

3124

2011

1234

3332

121

樣例輸出

5

14

1≤ n≤100 乙個人只能修乙個工件

這是一道費用流經典題目

1.設0為超級源點,2*n+1為超級匯點,第i個人的節點為i,第j件工作節點為j+n

2.從超級源點 向任意 i 屬於[1,n] 連線一條容量為1,費用為0的邊

3.從任意 j 屬於 [n+1,2*n] 向超級匯點連線一條容量為1,費用為0的邊

4.從任意 i 屬於 [1,n]向 任意 j 屬於 [n+1,n*2],連線一條容量為1,費用為ci,j​的邊

為各位大佬獻上我醜陋的**~

1 #include2

#define fq(i,a,b) for(register int i=a;i<=b;i++)

3#define prf printf

4#define scf scanf

5#define ll long long

6using

namespace

std;

7const

int n=5e4+10;8

int inf,n,num=1

,ne[n],fi[n],to[n],w[n],pl[n],s,t;

9int

dst[n],incf[n],p[n],vis[n],ans;

10 queueq;

11void

findmaxn()

1217

ll read()

1821

while(ch>='

0'&&ch<='9')

22return x*f; 23}

24void add(int x,int y,int z,int

kl)25

32bool

spfa()

33

52} 53}

54return dst[t]!=inf; 55}

56void

update()

5767 ans+=dst[t]*incf[t];68}

69bool

spfa_d()

7087}88

}89return dst[t]!=-inf;90}

91void

update_d()

92101 ans+=dst[t]*incf[t];

102}

103void add_x(int x,int y,int z,int

kl)104

108int

main()

109121

}122

for(int i=1;i<=n;i++)add_x(s,i,1,0),add_x(i+n,t,1,0

);123

while

(spfa())update();

124 printf("

%d\n

",ans);

125 ans=0

;126

for(int i=2;i<=num;i+=2)w[i]+=w[i^1],w[i^1]=0

;127

while

(spfa_d())update_d();

128 printf("

%d\n

",ans);

129return

0;

130}

131//

**月雩·薇嫭**

洛谷 P4014 分配問題

有 nn 件工作要分配給 nn 個人做。第 ii 個人做第 jj 件工作產生的效益為 c cij 試設計乙個將 nn 件工作分配給 nn 個人做的分配方案,使產生的總效益最大。輸入格式 檔案的第 11 行有 11 個正整數 nn,表示有 nn 件工作要分配給 nn 個人做。接下來的 nn 行中,每行...

洛谷P4014 分配問題(費用流)

傳送門 可以把原圖看做乙個二分圖,人在左邊,任務在右邊,求乙個帶權的最大和最小完美匹配 然而我並不會二分圖做法,所以只好直接用費用流套進去,求乙個最小費用最大流和最大費用最大流即可 1 minamoto 2 include3 include4 include5 include6 define inf...

洛谷P4014 分配問題 費用流

有 nn 件工作要分配給 nn 個人做。第 ii 個人做第 jj 件工作產生的效益為 c cij 試設計乙個將 nn 件工作分配給 nn 個人做的分配方案,使產生的總效益最大。輸入格式 檔案的第 11 行有 11 個正整數 nn 表示有 nn 件工作要分配給 nn 個人做。接下來的 nn 行中,每行...