题目链接


题意就是求一个最大流最小费用与最大费用,模板

思路:

  1. 源点到每个点建流为1,距离为0的点
  2. 每个点到汇点建流为1,距离为0的点
  3. 中间的点按照所给出的距离图来建立流为1的边

求最小值加正向距离的边,求最大值加距离的相反数。

每次跑一次spfa找出一条S->T的最短距离,将答案加入并且更新流。

当spfa到S不能到达T时输出答案。

记录一下模板:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define PI 3.14159265358979323846
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define pii make_pair
#define pr pair<int,int>
const int dir[4][2]={0,1,0,-1,1,0,-1,0};
typedef long long ll;
const ll inFF=9223372036854775807;
typedef unsigned long long ull;
using namespace std;
//最大流费用流
const int maxn=210;
const int maxm=3e4+10;
int pre[210],flow[210],dis[210],vis[210];
int head[210],sign;
int mp[105][105];
struct node
{int to,p,f,d;
}edge[maxm];
int n,st,ed,mincost;
void init()
{sign=0;memset(head,-1,sizeof(head));
}
void add(int u,int v,int f,int d)
{edge[sign]=node{v,head[u],f,d};head[u]=sign++;
}
void add_edge(int u,int v,int f,int d)//加双向边
{add(u,v,f,d);add(v,u,0,-d);
}
bool spfa()///跑sfpa顺便更新流
{for(int i=0;i<=2*n+1;i++){vis[i]=0;pre[i]=-1;flow[i]=dis[i]=inff;}vis[st]=1,dis[st]=0;queue<int> q;q.push(st);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];~i;i=edge[i].p){int v=edge[i].to,f=edge[i].f,d=edge[i].d;if(dis[v]>dis[u]+d&&f>0){dis[v]=dis[u]+d;flow[v]=min(flow[u],f);pre[v]=i;///pre[v]记录 u->v的这条边的编号if(!vis[v]){vis[v]=1;q.push(v);}}}}return dis[ed]!=inff;
}
void MCMF()
{mincost=0;while(spfa()){int f=flow[ed];/// maxflow+=f; 这里求最大流mincost+=f*dis[ed];///这里求最小费用/// pre[v]=i 记录 u->v的边编号为i   那么i^1这条边记录v->u,edge[i^1].to=u;for(int i=pre[ed];~i;i=pre[edge[i^1].to])///更新流{edge[i].f-=f;edge[i^1].f+=f;}}
}
int main()
{cin>>n;st=0,ed=2*n+1;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&mp[i][j]);init();for(int i=1;i<=n;i++){add_edge(0,i,1,0),add_edge(i+n,ed,1,0);for(int j=1;j<=n;j++)add_edge(i,j+n,1,mp[i][j]);}MCMF();cout<<mincost<<endl;init();for(int i=1;i<=n;i++){add_edge(0,i,1,0),add_edge(i+n,ed,1,0);for(int j=1;j<=n;j++)add_edge(i,j+n,1,-mp[i][j]);}MCMF();cout<<-mincost<<endl;return 0;
}

网络流24题(2) P4014 分配问题相关推荐

  1. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  2. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  3. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  4. 【题解】网络流24题一句话题解集合

    最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...

  5. cwl的网络流24题练习

    网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题   3 最小路径覆盖问题  有向图最小路径覆盖,解法都写题目上了 4 魔术球问题  有向图最 ...

  6. [线性规划与网络流24题] 网络流常见模型

    最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...

  7. 「网络流24题」 12. 软件补丁问题

    「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...

  8. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  9. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

最新文章

  1. PHP - 获取音频长度
  2. php api 20121113,php添加gd
  3. DNN中多任务学习概述
  4. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】
  5. java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
  6. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解
  7. linux 基础知识大全(收藏这一篇就够了)
  8. 图片放大后很模糊怎么办?
  9. 如何在Ubuntu系统下装windows10双系统
  10. Chart.js使用及ajax获取数据
  11. 当没有接口文档时候,测试人员如何测试?
  12. 当今商务中的礼仪(上)
  13. 小白scrapy试炼-爬取慕课网免费课程
  14. 微信小程序使用html2canvas,在小程序中使用canvas的方法示例
  15. 网易真题之暗黑字符串
  16. android网页版app,LOFTER网页版
  17. 李子的密码加密!(随机数版)完
  18. 基于javaweb汽车保险管理系统(前端+后端)
  19. HTML 水平居中 垂直居中 垂直水平居中的几种实现方式
  20. 未处理 SecurityException,PublicKeyToken=b77a5c561934e089 类型的权限已失败

热门文章

  1. Python import 的用法
  2. android Canvas 最基础知识总结
  3. Failed to resolve:com.android.support:appcompat-v7:27.+
  4. ADC中宽带巴伦的使用
  5. Django的下载与基本命令
  6. MySQL 单表优化
  7. Linux Supervisor的安装与使用入门
  8. C++中模块(Dll)对外暴露接口的方式
  9. JAVA-Eclipse快捷键
  10. Error: The INF file contains Unicode characters that could not be converted correctly