解题思路

还是建立超级源点和超级汇点,又因为题目给出规定一个人只能修一个工件,所以建图的时候还要讲容量都设为$1$。

人的编号是$1\rightarrow n$,工件的编号是$n+1\rightarrow 2\times n$。人和超级源点连边,工件和超级汇点连边,跑一个最小费用最大流和最大费用最大流。

附上代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. using namespace std;
  6. const int maxnode = , maxedge = , INF = ;
  7. inline int read() {
  8. int x = , f = ; char c = getchar();
  9. while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  10. while (c >= '' && c <= '') {x = x* + c-''; c = getchar();}
  11. return x * f;
  12. }
  13. int n, m, dis[maxnode], Depth[maxnode], head[maxnode], cnt = , s, t, Ans;
  14. struct edge {
  15. int nxt, u, v, w;
  16. }ed[maxedge];
  17. inline void addedge(int x, int y, int cap) {
  18. ed[++cnt].nxt = head[x];
  19. ed[cnt].v = y, ed[cnt].w = cap, ed[cnt].u = x;
  20. head[x] = cnt;
  21. }
  22. inline bool BFS() {
  23. queue<int> Q;
  24. memset(Depth, , sizeof(Depth));
  25. Depth[s] = , Q.push(s);
  26. int u;
  27. while(!Q.empty()) {
  28. u = Q.front();
  29. Q.pop();
  30. for(int i=head[u]; i; i=ed[i].nxt) {
  31. if(ed[i].w > && Depth[ed[i].v] == ) {
  32. Depth[ed[i].v] = Depth[u] + ;
  33. Q.push(ed[i].v);
  34. if(ed[i].v == t) return true;
  35. }
  36. }
  37. }
  38. return false;
  39. }
  40. inline int Dinic(int u, int cap) {
  41. if(u == t) return cap;
  42. int delta;
  43. for(int i=head[u]; i; i=ed[i].nxt) {
  44. if(Depth[ed[i].v] == Depth[u] + && ed[i].w > ) {
  45. delta = Dinic(ed[i].v, min(cap, ed[i].w));
  46. if(delta > ) {
  47. ed[i].w -= delta;
  48. ed[i^].w += delta;
  49. return delta;
  50. }
  51. }
  52. }
  53. return ;
  54. }
  55. int main() {
  56. n = read(), m = read();
  57. s = , t = n+m+;
  58. for(int i=; i<=n; i++) addedge(s, i, ), addedge(i, s, );
  59. for(int i=n+; i<=m; i++) addedge(i, t, ), addedge(t, i, );
  60. static int x, y;
  61. while () {
  62. x = read(), y = read();
  63. addedge(x, y, ), addedge(y, x, );
  64. if(x == - && y == -) break;
  65. }
  66. while (BFS()) Ans += Dinic(s, INF);
  67. if(Ans) printf("%d\n", Ans);
  68. else printf("No Solution!\n");
  69. if(Ans) {
  70. for(int i=; i<=cnt; i+=) {
  71. if(ed[i].v != s && ed[i].v != t && ed[i^].v != s && ed[i^].v != t)
  72. if(ed[i^].w != )printf("%d %d\n", ed[i].u, ed[i].v);
  73. }
  74. }
  75. return ;
  76. }

Luogu P4014 「 网络流 24 题 」分配问题的更多相关文章

  1. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

  2. 【刷题】LOJ 6012 「网络流 24 题」分配问题

    题目描述 有 \(n\) 件工作要分配给 \(n\) 个人做.第 \(i\) 个人做第 \(j\) 件工作产生的效益为 \(c_{ij}\) ​​.试设计一个将 \(n\) 件工作分配给 \(n\) ...

  3. 【LOJ】 #6012. 「网络流 24 题」分配问题

    题解 又写了一遍KM算法,这题刚好是把最大最小KM拼在一起写的,感觉比较有记录价值 感觉KM始终不熟啊QAQ 算法流程大抵如下,原理就是每次我们通过减少最少的匹配量达成最大匹配,所以获得的一定是最大价 ...

  4. 2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)

    传送门 费用流水题. 依然是照着题意模拟建边就行了. 为了练板子又重新写了一遍费用流. 代码: #include<bits/stdc++.h> #define N 305 #define ...

  5. Luogu P4016 「 网络流 24 题 」负载平衡问题

    吐槽题目难度,这个题建模好像比前两个都要难,但是难度评级却比第二个要低. 解题思路 依旧是考虑如何建模和建立源点汇点.每个点的货物数量到最后都一样的话肯定是等于他们的平均值.用 $num$ 数组存储原 ...

  6. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  7. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

  8. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  9. Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)

    Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...

随机推荐

  1. ARP协议(4)ARP编程

    之前的几篇文章,分别介绍了 ARP 协议格式,在vs2012里配置winpcap环境,我们该做的准备都已经做完了.如今我们真正来实现了. 一.定义数据结构 依据ARP的协议格式,设计一个ARP协议格式 ...

  2. 蓝桥 ADV-230 算法提高 12-1三角形 【数学公式】

      算法提高 12-1三角形   时间限制:1.0s   内存限制:256.0MB      问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的 ...

  3. Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps

    Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps 在Bing Maps开发中,由于各种应用功能的不同,更多的时候用户可能需要将自己的一部分图片数据作为地图 ...

  4. CF 1042 A Benches —— 二分答案(水题)

    题目:http://codeforces.com/problemset/problem/1042/A 代码如下: #include<iostream> #include<cstdio ...

  5. CF 1036 B Diagonal Walking v.2 —— 思路

    题目:http://codeforces.com/contest/1036/problem/B 题意:从 (0,0) 走到 (n,m),每一步可以向八个方向走一格,问恰好走 k 步能否到达,能到达则输 ...

  6. Spark 二项逻辑回归__二分类

    package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{B ...

  7. bzoj 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛【dp】

    写了个bfs发现MLE了... 设f[t][i][j]为在t时刻走到(i,j)的方案数,转移和bfs一样 #include<iostream> #include<cstdio> ...

  8. bzoj 1627: [Usaco2007 Dec]穿越泥地【bfs】

    在洛谷上被卡了一个点开了O2才过= = bfs即可,为方便存储,把所有坐标+500 #include<iostream> #include<cstdio> #include&l ...

  9. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  10. Linux学习之01_基础命令介绍

    初学Linux,还在摸索中,在这个过程中希望能记录下学习到的东西,参考的的书籍为<鸟哥的Linux私房菜> 在这里学到的主要命令有这几个: data cal bc man shutdown ...