牛客网暑期ACM多校训练营(第五场) E room(最小费用最大流 , 最小权二分图匹配模板)
链接:
https://www.nowcoder.com/acm/contest/143/E
题意:
给定n个宿舍的新安排, 每个宿舍都有4个人, 问要至少有多少个人换位才能变成新安排。
可以建一个二分图, 左边n个点为原来的安排, 右边n个点为新安排, 每条边花费设为( 4 - 交集), 然后跑费用流。
#include<bits/stdc++.h>
using namespace std;
const int maxN = ;
const int maxM = 1e5 + ;
const int INF = 1e9 + ;
int n, ecnt, S, T;
struct {
int to, w, cost, nxt;
} edge[maxM]; struct Node{
int v, id;
}pre[maxN];
int head[maxN];
int bef[maxN][], after[maxN][]; void init() {
memset(head, -, sizeof(head));
ecnt = ;
}
void addEdge(int u, int v, int w, int c) {
edge[ecnt].to = v;
edge[ecnt].w = w;
edge[ecnt].cost = c;
edge[ecnt].nxt = head[u];
head[u] = ecnt++;
}
inline int dif(int a, int b) {
int res = ;
for(int i = ; i < ; i++) {
for(int j = ; j < ; j++) {
if(bef[a][i] == after[b][j]) {
res--;
break;
}
}
}
return res;
}
void build() {
S = , T = * n + ; for(int i = ; i <= n; i++) {
addEdge(S, i, , );
addEdge(i, S, , );
addEdge(i + n, T, , );
addEdge(T, i + n, , );
} for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
int c = dif(i, j);
addEdge(i, j + n, , c);
addEdge(j + n, i, , -c); //建反向边的时候注意花费要为负
}
}
}
int vis[maxN], cost[maxN];
bool spfa(){
queue<int> q;
memset(vis, , sizeof(vis));
fill(cost ,cost + maxN, INF);
vis[S] = ;
cost[S] = ;
q.push(S);
while(!q.empty()){
int u = q.front();
for(int i = head[u]; i != -; i = edge[i].nxt){
int v = edge[i].to, f = edge[i].w , c = edge[i].cost;
if(f == || cost[v] <= cost[u] + c) continue;
cost[v] = cost[u] + c;
pre[v].v = u;
pre[v].id = i;
if(!vis[v]){
q.push(v);
vis[v] = true;
}
}
vis[u] = ;
q.pop();
}
return cost[T] != INF;
}
int MCMF(){
int flow = ;
int minCost = ;
while(spfa()){
int minFlow = INF;
for(int i = T; i != S; i = pre[i].v){
minFlow = min(minFlow, edge[pre[i].id].w);
}
for(int i = T; i != S; i = pre[i].v){
edge[pre[i].id].w -= minFlow;
edge[pre[i].id ^ ].w += minFlow;
}
minCost += cost[T];
}
return minCost;
}
int main() {
// freopen("1.txt","r", stdin);
ios::sync_with_stdio(false); cin >> n;
init();
for(int i = ; i <= n; i++)
for(int j = ; j < ; j++)
cin >> bef[i][j]; for(int i = ; i <= n; i++)
for(int j = ; j < ; j++)
cin >> after[i][j]; build();
cout << MCMF() << "\n";
}
牛客网暑期ACM多校训练营(第五场) E room(最小费用最大流 , 最小权二分图匹配模板)的更多相关文章
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学
牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...
- 牛客网暑期ACM多校训练营(第九场) A题 FWT
链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...
- 牛客网暑期ACM多校训练营(第九场)D
链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...
- 牛客网暑期ACM多校训练营(第二场)B discount
链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 牛客网暑期ACM多校训练营(第二场) I Car 思维
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...
- 牛客网暑期ACM多校训练营(第二场) D money 思维
链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 White Cloud has built n stores numbered from 1 t ...
随机推荐
- Asp.net开发必备51种代码
1.//弹出对话框.点击转向指定页面 Response.Write("<script>window.alert('该会员没有提交申请,请重新提交!')</script> ...
- uvm_factory——我们的工厂(二)
上节我们说到uvm_object_registry #(T),uvm_object_reistry 又继承自uvm_object_wrapper,所以首先,让我们先看看它爹是啥样子的: //----- ...
- Hadoop2.6.2的Eclipse插件的使用
欢迎转载,且请注明出处,在文章页面明显位置给出原文连接. 本文链接:http://www.cnblogs.com/zdfjf/p/5178197.html 首先给出eclipse插件的下载地址:htt ...
- c#将本地文件上传至服务器(内网)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- codeforces 121 E. Lucky Array
time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...
- 通过90行代码学会HTML5 WebSQL的4种基本操作
Web SQL数据库API是一个独立的规范,在浏览器层面提供了本地对结构化数据的存储,已经被很多现代浏览器支持了. 我们通过一个简单的例子来了解下如何使用Web SQL API在浏览器端创建数据库表并 ...
- decompressedResponseImageOfSize:completionHandler:]_block_invoke
原因: It turns out the linker error was caused by the CGImageSourceCreateWithData call. And the root ...
- Luogu P5349 幂
大力数学题,发现自己好久没写多项式水平急速下降,求逆都要写挂233 首先看到关于多项式的等比数列求和,我们容易想到先求出每一项的系数然后最后累加起来即可,即设\(f_i=\sum_{n=0}^{\in ...
- PE基础2
PE课程002 怎么找到Nt头? (PIMAGE_NT_HEADER)(DOS.e_lfanew + (DWORD)m_pBuff) 怎么找到第一个区段表? 区段头位置 = pNt + 4 + 文件头的 ...
- 多源最短路径floyd
#include<iostream> #define INF 105 using namespace std; int main() { ][],mark,x,y,g; while(cin ...