Description

有n件工作要分配给n个人做。第i 个人做第j 件工作产生的效益为Cij 。试设计一个将 n件工作分配给n个人做的分配方案,使产生的总效益最大。 编程任务: 对于给定的n件工作和n个人,计算最优分配方案和最差分配方案。

Input

由文件input.txt提供输入数据。文件的第1 行有1 个正整数n,表示有n件工作要分配 给n 个人做。接下来的n 行中,每行有n 个整数Cij ,1≤i≤n,1≤j≤n(n<=100),表示第i 个人做 第j件工作产生的效益为Cij。

Output

程序运行结束时,将计算出的最小总效益和最大总效益输出到文件output.txt中。

Sample Input

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

Sample Output

5 14

题解:

(S,人,1,0) (工作,T,1,0) (人,工作,INF,map[i][j])

然后最小费用就是跑spfa增广最小cost

最大费用就是把map[i][j]设成负的,然后一样跑spfa,答案即为-ans

可笑的是傻逼的我搞了个层次网络,然后挂了.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int N=505,INF=1999999999;
 7 int gi(){
 8     int str=0;char ch=getchar();
 9     while(ch>'9'||ch<'0')ch=getchar();
10     while(ch>='0' && ch<='9')str=str*10+ch-'0',ch=getchar();
11     return str;
12 }
13 int n,S=0,T,num=1,head[N];
14 struct Lin{
15     int next,to,dis,cost;
16 }a[N*N];
17 int map[101][101];
18 void init(int x,int y,int dis,int cost){
19     a[++num].next=head[x];
20     a[num].to=y;
21     a[num].dis=dis;
22     a[num].cost=cost;
23     head[x]=num;
24     a[++num].next=head[y];
25     a[num].to=x;
26     a[num].dis=0;
27     a[num].cost=-cost;
28     head[y]=num;
29 }
30 bool vis[N];int q[N*10],pre[N],f[N],ans=0;
31 bool spfa()
32 {
33     for(int i=0;i<=T;i++)f[i]=INF,vis[i]=false;
34     q[1]=S;f[S]=0;int x,u,t=0,sum=1;
35     while(t!=sum)
36     {
37         x=q[++t];
38         for(int i=head[x];i;i=a[i].next){
39             u=a[i].to;
40             if(a[i].dis<=0)continue;
41             if(f[x]+a[i].cost<f[u]){
42                 f[u]=f[x]+a[i].cost;
43                 pre[u]=i;
44                 if(!vis[u])vis[u]=true,q[++sum]=u;
45             }
46         }
47         vis[x]=false;
48     }
49     if(f[T]!=INF)
50     ans+=f[T];
51     return f[T]!=INF;
52 }
53 void Change()
54 {
55     int x=T;
56     while(x){
57         a[pre[x]].dis--;
58         a[pre[x]^1].dis++;
59         x=a[pre[x]^1].to;
60     }
61 }
62 void Clear(){
63     memset(head,0,sizeof(head));
64     num=1;ans=0;
65 }
66 int main()
67 {
68     n=gi();T=(n<<1)+1;
69     for(int i=1;i<=n;i++)init(S,i,1,0),init(i+n,T,1,0);
70     for(int i=1;i<=n;i++){
71         for(int j=1;j<=n;j++){
72             map[i][j]=gi();init(i,j+n,INF,map[i][j]);
73         }
74     }
75     while(spfa()){
76         Change();
77     }
78     printf("%d\n",ans);
79     Clear();
80     for(int i=1;i<=n;i++)init(S,i,1,0),init(i+n,T,1,0);
81     for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)init(i,j+n,INF,-map[i][j]);
82     while(spfa()){
83         Change();
84     }
85     printf("%d",-ans);
86     return 0;
87 }

转载于:https://www.cnblogs.com/Yuzao/p/6877808.html

【网络流24题】分配问题 最小最大费用最大流相关推荐

  1. 【网络流24题】圆桌聚餐(最大流)

    [网络流24题]圆桌聚餐(最大流) 题面 Cogs 题解 这道题很简单 首先每个单位的人数限制 直接从源点向单位连边,容量为人数 同样的, 每个桌子向汇点连边,容量为可以坐的人数 因为每个桌子只能够做 ...

  2. [网络流24题] 负载平衡问题 (费用流)

    洛谷传送门 LOJ传送门 本题解思路来自hzwer黄学长 搬运后每个位置应该有的货物数量$num=\frac{\sum a_{i}}{n}$ 那么大于$num$的位置都应该把一部分货物提供给其他位置, ...

  3. [网络流24题] 航空路线问题 (费用流)

    洛谷传送门 LOJ传送门 这道题的图还挺好想的吧 反正都是无向边,起点走到终点再回到起点,就相当于从起点走$2$次到达终点,且这两次不经过相同的点,还要经过尽可能多的点 很经典的费用流建图 限制点通过 ...

  4. 【网络流24题】最小路径覆盖问题

    [题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...

  5. 流网络的最小割问题c语言,「网络流24题」最小路径覆盖问题

    Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...

  6. [网络流24题][CODEVS1914]运输问题(费用流)

    题目描述 传送门 题解 从源点向每一个仓库连边,费用为0,容量为仓库中货物数量: 从每一个零售店向汇点连边,费用为0,容量为零售店应得的货物数量: 从仓库向零售店连边,费用为该仓库运到零售店的费用. ...

  7. LibreOJ #6002. 「网络流 24 题」最小路径覆盖

    内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 网络流 最大流 屠龙宝刀点击就送 #include <cs ...

  8. LOJ#6002. 「网络流 24 题」最小路径覆盖

    模板. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 //#include<ti ...

  9. 【网络流24题】搭配飞行员(最大流+二分图匹配)

    传送门 搭配飞行员     题意:二分图匹配裸题,不多说 I think Dinic算法跑最大流解决||匈牙利算法 Code 代码一:Dinic #include<cstdio> #inc ...

  10. 【网络流24题】圆桌聚餐 (最大流)

    题意 假设有来自 nn n 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 riri r_i ​​.会议餐厅共有 mm m 张餐桌,每张餐桌可容纳 cici c_i​​ 个代表就餐. 为了使 ...

最新文章

  1. How to read a book
  2. 嵌入式Linux综合知识
  3. C Primer Plus 第5章 运算符、表达式和语句 编程练习及答案
  4. 无监督学习与有监督学习的本质区别是什么_吴恩达老师课程笔记系列第三节-无监督学习定义...
  5. nGQL知识点总结-20210719
  6. const对象,NULL和nullptr,C++中创建对象数组
  7. 1到n阶乘算法的改进
  8. Qt中echo服务器的简单编写
  9. Codeforces Round #445 div.2 D. Restoration of string 乱搞
  10. 【codevs1033】蚯蚓的游戏问题,费用流
  11. 基于用户长短期表示的新闻推荐
  12. Wix 3.0正式发布
  13. Android APK的加密
  14. 对称密钥和非对称密钥
  15. 机器人潘森护盾_新版潘森无伤抗塔 E技能护盾机制全解析
  16. Java 9 的 9 个特性
  17. 分布式散列表(DHT)及具体实现Kademlia(kad)/Chord
  18. 基于图像的三维重建——针孔相机模型(1)
  19. 用python实现12306登录、查票(小白都一看就懂的)
  20. python_while 循环_珠穆朗玛峰

热门文章

  1. mysql死锁自动处理方法_19. 死锁的产生和 MySQL 自动处理方式
  2. latex IEEE 模板 使用bib BibTeX
  3. 区块链 xuperchain io.grpc.StatusRuntimeException: UNKNOWN: error execution reverted: execution reverted
  4. 怎么判断噎到没噎到_怎么判定股市是在走牛市还是走熊市呢?两种最简单的判定方法...
  5. java 正则 非贪婪_正则表达式中贪婪模式与非贪婪模式的区别
  6. 数据结构和算法——八种常用的排序算法------基数排序
  7. 设计模式之GOF23外观模式
  8. linux编写设备驱动 编译成ko文件 重新编译内核,Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit...
  9. android状态栏虚拟按键适配,Android开发笔记——透明状态栏与透明虚拟按键
  10. window远程桌面连接实现连接他人电脑=》mstsc