時空限制1000ms / 256mb
有 n件工作要分配給 n個人做。第 i個人做第 j件工作產生的效益為 c[i][j]。試設計乙個將 n件工作分配給 n個人做的分配方案,使產生的總效益最大。
輸入格式:
檔案的第 1行有 1 個正整數 n ,表示有 n 件工作要分配給 n 個人做。
接下來的 n行中,每行有 n個整數 c,表示第 i個人做第 j件工作產生的效益為 c[i][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
51≤n≤10014
乙個人只能做乙個工作
二分圖多重最優匹配。
感覺就是費用流,只不過知道模型容易建圖了一些。
#include#define n 505view code#define inf llong_max/2
using
namespace
std;
typedef
struct
ss;ss edg[n*n];
vector
edges[n];
int now_edges=0
;void addedge(int u,int v,long
long flow,long
long
cost)
; edges[v].push_back(now_edges);
edg[now_edges++]=(ss);
}bool spfa(int s,int t,long
long &flow,long
long &cost)
; vis[s]=1
; queue
q;q.push(s);
int pre[n]=;
long
long maxflow[n]=;
maxflow[s]=inf;
while(!q.empty())
}}
}if(dis[t]==inf)return
false
;
flow+=maxflow[t];
cost+=dis[t]*maxflow[t];
long
long now=t;
while(now!=s)
return
true;}
void mcmf(int s,int t,long
long &flow,long
long &cost)
void
init()
int c[505][505
];int
main()
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)addedge(i,j+n,1
,c[i][j]);
for(int i=1;i<=n;i++)
long
long flow=0,cost=0
; mcmf(s,t,flow,cost);
printf(
"%lld\n
",cost);
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)addedge(i,j+n,1,-c[i][j]);
for(int i=1;i<=n;i++)
flow=0
; cost=0
; mcmf(s,t,flow,cost);
printf(
"%lld\n
",-cost);
return0;
}
分配問題 網路流24題
沙雕題,建圖很簡單。跑一遍最小費用,再把邊權取反重跑一遍最小費用。include define rep i,a,b for int i a i b i using namespace std const int n 250 int n,m,s,t,tot int head n struct node...
題解 網路流24題之分配問題
傳送門 分配問題就是將人和工作分開來做匹配,但是與一般的二分圖匹配不同的是,每個匹配都是有權值的。這個問題就是二分圖最大權完美匹配問題。雖然這個問題可以用二分圖最大權完美匹配的專門演算法km演算法解決,但是這裡只講網路流解法。首先發現人和工作的下標都是1 n的,直接建圖會產生歧義,於是我們可以定義人...
網路流24題18 分配問題
有 n 件工作要分配給 n 個人做。第 i 個人做第 j 件工作產生的效益為ci j 試設計乙個將n 件工作分配給 n 個人做的分配方案,使產生的總效益最大。對於給定的 n 件工作和 n 個人,計算最優分配方案和最差分配方案。第 1 行有 1 個正整數 n,表示有 n 件工作要分配給 n 個人做。接...