Luogu P4014 「 网络流 24 题 」分配问题
解题思路
还是建立超级源点和超级汇点,又因为题目给出规定一个人只能修一个工件,所以建图的时候还要讲容量都设为$1$。
人的编号是$1\rightarrow n$,工件的编号是$n+1\rightarrow 2\times n$。人和超级源点连边,工件和超级汇点连边,跑一个最小费用最大流和最大费用最大流。
附上代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxnode = , maxedge = , INF = ;
inline int read() {
int x = , f = ; char c = getchar();
while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while (c >= '' && c <= '') {x = x* + c-''; c = getchar();}
return x * f;
}
int n, m, dis[maxnode], Depth[maxnode], head[maxnode], cnt = , s, t, Ans;
struct edge {
int nxt, u, v, w;
}ed[maxedge];
inline void addedge(int x, int y, int cap) {
ed[++cnt].nxt = head[x];
ed[cnt].v = y, ed[cnt].w = cap, ed[cnt].u = x;
head[x] = cnt;
}
inline bool BFS() {
queue<int> Q;
memset(Depth, , sizeof(Depth));
Depth[s] = , Q.push(s);
int u;
while(!Q.empty()) {
u = Q.front();
Q.pop();
for(int i=head[u]; i; i=ed[i].nxt) {
if(ed[i].w > && Depth[ed[i].v] == ) {
Depth[ed[i].v] = Depth[u] + ;
Q.push(ed[i].v);
if(ed[i].v == t) return true;
}
}
}
return false;
}
inline int Dinic(int u, int cap) {
if(u == t) return cap;
int delta;
for(int i=head[u]; i; i=ed[i].nxt) {
if(Depth[ed[i].v] == Depth[u] + && ed[i].w > ) {
delta = Dinic(ed[i].v, min(cap, ed[i].w));
if(delta > ) {
ed[i].w -= delta;
ed[i^].w += delta;
return delta;
}
}
}
return ;
}
int main() {
n = read(), m = read();
s = , t = n+m+;
for(int i=; i<=n; i++) addedge(s, i, ), addedge(i, s, );
for(int i=n+; i<=m; i++) addedge(i, t, ), addedge(t, i, );
static int x, y;
while () {
x = read(), y = read();
addedge(x, y, ), addedge(y, x, );
if(x == - && y == -) break;
}
while (BFS()) Ans += Dinic(s, INF);
if(Ans) printf("%d\n", Ans);
else printf("No Solution!\n");
if(Ans) {
for(int i=; i<=cnt; i+=) {
if(ed[i].v != s && ed[i].v != t && ed[i^].v != s && ed[i^].v != t)
if(ed[i^].w != )printf("%d %d\n", ed[i].u, ed[i].v);
}
}
return ;
}
Luogu P4014 「 网络流 24 题 」分配问题的更多相关文章
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- 【刷题】LOJ 6012 「网络流 24 题」分配问题
题目描述 有 \(n\) 件工作要分配给 \(n\) 个人做.第 \(i\) 个人做第 \(j\) 件工作产生的效益为 \(c_{ij}\) .试设计一个将 \(n\) 件工作分配给 \(n\) ...
- 【LOJ】 #6012. 「网络流 24 题」分配问题
题解 又写了一遍KM算法,这题刚好是把最大最小KM拼在一起写的,感觉比较有记录价值 感觉KM始终不熟啊QAQ 算法流程大抵如下,原理就是每次我们通过减少最少的匹配量达成最大匹配,所以获得的一定是最大价 ...
- 2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)
传送门 费用流水题. 依然是照着题意模拟建边就行了. 为了练板子又重新写了一遍费用流. 代码: #include<bits/stdc++.h> #define N 305 #define ...
- Luogu P4016 「 网络流 24 题 」负载平衡问题
吐槽题目难度,这个题建模好像比前两个都要难,但是难度评级却比第二个要低. 解题思路 依旧是考虑如何建模和建立源点汇点.每个点的货物数量到最后都一样的话肯定是等于他们的平均值.用 $num$ 数组存储原 ...
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...
- Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...
随机推荐
- 容器Vector原理(学习)
一.概述 数据结构同ArrayList,底层都是数组存储,只不过是线程同步的,也就是其 操作方法都是synchronized
- 编译android的一些坑
1 降级gcc g++到4.4 2 参考:http://source.android.com/source/initializing.html来配置环境 3 使用jdk1.6 包括 java java ...
- CentOS查看CPU、内存、网络流量和磁盘 I/O【详细】
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/swrqm/s: 每秒进行 merge 的 ...
- 继续不温不火Windows Phone
已经辞了,人也离开帝都了.是否还会回去? 不知道,也许脑子突然正常了又跑回去了. 如题,继续不温不火的Windows Phone. 今年2014,没错,Windows Phone是新加了好几家厂商,微 ...
- openssh常用命令记录
command description date ssh [user@]hostname[:port] 登录远程机器 2017-03-21 scp <local_file> <use ...
- Varnish的VCL
Varnish的子进程 VCL Varnish配置语言VCL是一种"域"专有类型的配置语言,用于描述Varnish Cache的请求处理和文档高速缓存策略. 当加载新配置时,Man ...
- CSS里#和.以及大小写
# 选定ID . 选定class 大小写严格区分,因此选定class和设定class等要一致
- P4196 [CQOI2006]凸多边形
传送门 半平面交的讲解 然而这个代码真的是非常的迷--并不怎么看得懂-- //minamoto #include<bits/stdc++.h> #define fp(i,a,b) for( ...
- OAuth2.0最简向导
无论你是否有技术背景,你都能看懂授权协议框架OAuth2.0 翻译来自:川崎高彦对自己投资人讲解自己的SaaS安全产品. Got it! https://medium.com/@darutk/the- ...
- python中多线程(1)
一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...