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

2021-08-18 12:29:44 字數 1526 閱讀 9939

沒想到codevs上的資料和我本地的資料是一樣的……這下不用寫多餘的**了

這道題和上一道題一樣水,按照提議寫成二分圖就行。

1.源點向每個人連一條邊,容量1,費用0,每個任務向匯點連一條邊,容量1,費用0

2.每個人向每個任務連一條邊,容量1,費用為cij

跑兩次費用流就行

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 100000;

const

int maxm = 100000;

const

int inf = 0x3f3f3f3f;

struct edge

edge[maxm];

int head[maxn],tol;

int pre[maxn],dis[maxn];

bool vis[maxn];

int n;//節點總個數,節點編號從0~n-1

void init(int n)

void addedge(int u,int v,int cap,int cost)

bool spfa(int s,int t)

dis[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty())}}

}if(pre[t] == -1)

return

false;

else

return

true;

}//返回的是最大流,cost存的是最小費用

int mincostmaxflow(int s,int t,int &cost)

for(int i = pre[t]; i != -1; i = pre[edge[i^1].to])

flow += min;

}return flow;

}void print_all()

}int c[1001][1001];

int main()

}init(2*n+2);

int st = 0,en = 2 *n + 1;

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

}int cost;

mincostmaxflow(0,2*n + 1,cost);

printf("%d\n",cost);

init(2*n+2);

st = 0,en = 2 *n + 1;

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

}cost = 0;

mincostmaxflow(0,2*n + 1,cost);

printf("%d\n",-cost);

return

0;}

網路流二十四題

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

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

有 n 件工作要分配給 n個人做。第 i 個人做第 j件工作產生的效益為 ci j 試設計乙個將 n 件工作分配給 n個人做的分配方案,使產生的總效益最大。對於給定的 n 件工作和 n個人,計算最優分配方案和最差分配方案。檔案的第 1 行有 1個正整數 n 表示有 n件工作要分配給 n 個人做。接下...

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

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