網路流二十四題之十八 分配問題

2021-07-11 19:59:34 字數 1875 閱讀 8399

n 件工作要分配給

n個人做。 第 i

個人做第

j件工作產生的效益為 ci

j 。

試設計乙個將

n 件工作分配給

n個人做的分配方案,使產生的總效益最大。

對於給定的

n 件工作和

n個人,計算最優分配方案和最差分配方案。

檔案的第

1 行有

1個正整數

n ,表示有

n件工作要分配給

n 個人做。

接下來的

n行中,每行有

n 個整數 ci

j,1≤

i≤n,

1≤j≤

n(n<=

100)

,表示第

i 個人做 第 j

件工作產生的效益為 ci

j 。

程式執行結束時,將計算出的最小總效益和最大總效益輸出到檔案。

5

2 2 2 1 2

2 3 1 2 4

2 0 1 1 1

2 3 4 3 3

3 2 1 2 1

5

14

第一次打費用流的題目。

本題建模很容易看出來,就只是加乙個源點和匯點。

至於兩個要求,就分別求出最小費用流和最大費用流即可。

[cpp]

#include 

#include 

#include 

#include 

#define inf 0x3f3f3f3f

#define maxn (250)

#define ss 0

#define tt 220

#define min(x,y) ((x)<(y)?(x):(y))

using

namespace std;  

int n,cnt,ans;  

int head[maxn],nxt[maxn*maxn*2],data[maxn*maxn*2],flow[maxn*maxn*2],wei[maxn*maxn*2];  

int flow2[maxn*maxn*2];  

int pre[maxn],dis[maxn];  

bool in_stack[maxn];  

queueq;  

void add(int x,int y,int z,int w)  

bool bfs1()  

}  }  

}  return dis[tt]0;  

}  bool bfs2()  

}  }  

}  return pre[tt]>0;  

}  void dfs1()  

}  void dfs2()  

}  int main()  

}  memcpy(flow2,flow,sizeof flow);  

ans=0;  

while(bfs1())dfs1();  

for(int i=0;iif(data[i]>=n+1&&data[i]<=n+n&&!flow[i])ans+=wei[i];  

printf(」%d\n」,ans);  

ans=0;  

while(bfs2())dfs2();  

for(int i=0;iif(data[i]>=n+1&&data[i]<=n+n&&!flow2[i])ans+=wei[i];  

printf(」%d\n」,ans);  

return 0;  

}  

網路流二十四題之分配問題

沒想到codevs上的資料和我本地的資料是一樣的 這下不用寫多餘的 了 這道題和上一道題一樣水,按照提議寫成二分圖就行。1.源點向每個人連一條邊,容量1,費用0,每個任務向匯點連一條邊,容量1,費用0 2.每個人向每個任務連一條邊,容量1,費用為cij 跑兩次費用流就行 include includ...

網路流二十四題

開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...

網路流二十四題之航空路線問題

這道題的建模很有意思 1.首先每個點,除了起點,都向拆點後的點練一天容量1,費用 1的邊,代表只能走一次,負費用是為了求最大的費用,也就是最多的經過點。對於起點,容量變成2,費用不變。2.其次對於一天航線,終點在拆點後的點集向起點連一條邊,容量無限,費用為0,代表兩個城市可以達到。之後一次費用流,如...