可能再也用不到了吧,今天整理电脑文件看到的,作为图论选手,留个纪念,

//原图: 对于pi,拆点xi,yi s->S,[m,m],0 S->xi,[0,inf],0 yi->t,[0,inf],0 xi->yi,[vi,vi],0 对于有航线的pi和pj,yi->xj,[0,inf],cost//这样就建好了原图 那么有源汇有上下界的费用流的改造方法: 首先建立附加源汇ss,tt 对于原图里有的一条边x->y,[l,r],cost,变成x->y,r-l,cost 每一个点的权di定义为所有流入这个点的边的下界和-所有流出这个点的边的下界和 对于一个点i,若di>0,ss->i,di,0;若di<0,i->tt,-di,0 连边t->s,inf,0 然后对ss,tt做最小费用最大流 最终的费用为(网络流中计算的费用+原图中有费用的边的下界*这条边的费用)//代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
#define N 40005
#define inf 2000000000
int n,m,x,mincost,s,t,S,ss,tt;
int tot,point[N],nxt[N],v[N],remain[N],c[N];
int dis[N],last[N],d[N];
bool vis[N];
queue <int> q;
void addedge(int x,int y,int cap,int z) {++tot;nxt[tot]=point[x];point[x]=tot;v[tot]=y;remain[tot]=cap;c[tot]=z;++tot;nxt[tot]=point[y];point[y]=tot;v[tot]=x;remain[tot]=0;c[tot]=-z;
}
int addflow(int s,int t) {int now=t,ans=inf;while (now!=s) {ans=min(ans,remain[last[now]]);now=v[last[now]^1];}now=t;while (now!=s) {remain[last[now]]-=ans;remain[last[now]^1]+=ans;now=v[last[now]^1];}return ans;
}
bool spfa(int s,int t) {memset(dis,127,sizeof(dis));dis[s]=0;memset(vis,0,sizeof(vis));vis[s]=1;while (!q.empty()) q.pop();q.push(s);while (!q.empty()) {int now=q.front();q.pop();vis[now]=0;for (int i=point[now]; i!=-1; i=nxt[i]) if (dis[v[i]]>dis[now]+c[i]&&remain[i]) {dis[v[i]]=dis[now]+c[i];last[v[i]]=i;if (!vis[v[i]]) {vis[v[i]]=1;q.push(v[i]);}}}if (dis[t]>inf) return 0;int flow=addflow(s,t);mincost+=flow*dis[t];return 1;
}
int main() {tot=-1;memset(point,-1,sizeof(point));scanf("%d%d",&n,&m);S=n+n+1,s=S+1,t=s+1;ss=t+1,tt=ss+1;d[s]-=m,d[S]+=m;for (int i=1; i<=n; ++i) {scanf("%d",&x);addedge(S,i,inf,0);addedge(n+i,t,inf,0);d[i]-=x,d[n+i]+=x;}for (int i=1; i<n; ++i) for (int j=i+1; j<=n; ++j) {scanf("%d",&x);if (x==-1) continue;addedge(n+i,j,inf,x);}for (int i=1; i<=t; ++i) {if (d[i]>0) addedge(ss,i,d[i],0);if (d[i]<0) addedge(i,tt,-d[i],0);}addedge(t,s,inf,0);while (spfa(ss,tt));PRintf("%d\n",mincost);
}#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define INF 1e9
const int N=30000;
int tot=-1,nxt[N],point[N],remind[N],c[N],last[N],dis[N],v[N],mincost,d[N];
bool vis[N];
void addline(int x,int y,int cap,int cc) {++tot;nxt[tot]=point[x];point[x]=tot;v[tot]=y;remind[tot]=cap;c[tot]=cc;++tot;nxt[tot]=point[y];point[y]=tot;v[tot]=x;remind[tot]=0;c[tot]=-cc;
}
int addflow(int s,int t) {int now=t,ans=INF;while (now!=s) {ans=min(ans,remind[last[now]]);now=v[last[now]^1];}now=t;while (now!=s) {remind[last[now]]-=ans;remind[last[now]^1]+=ans;now=v[last[now]^1];}return ans;
}
bool spfa(int s,int t) {queue<int>q;q.push(s);memset(dis,0x7f,sizeof(dis));memset(vis,0,sizeof(vis));dis[s]=0;while (!q.empty()) {int x=q.front();q.pop();vis[x]=0;for (int i=point[x]; i!=-1; i=nxt[i])if (dis[v[i]]>dis[x]+c[i] && remind[i]) {last[v[i]]=i;dis[v[i]]=dis[x]+c[i];if (!vis[v[i]]) vis[v[i]]=1,q.push(v[i]);}}if (dis[t]>INF) return 0;int flow=addflow(s,t);mincost+=flow*dis[t];return 1;
}
int main() {memset(point,-1,sizeof(point));int x,n,m;scanf("%d%d",&n,&m);int s=n*2+1,S=s+1,t=S+1,ss=t+1,tt=ss+1;addline(s,S,m,0);
//   d[s]-=m; d[S]+=m;for (int i=1; i<=n; i++) addline(S,i,INF,0),addline(i+n,t,INF,0);for (int i=1; i<=n; i++) scanf("%d",&x),d[i]-=x,d[i+n]+=x;for (int i=1; i<n; i++)for (int j=i+1; j<=n; j++) {scanf("%d",&x);if (x!=-1) addline(i+n,j,INF,x);}for (int i=1; i<=n; i++) addline(i+n,t,INF,0);for (int i=1; i<=t; i++) {if (d[i]>0) addline(ss,i,d[i],0);if (d[i]<0) addline(i,tt,-d[i],0);}addline(t,s,INF,0);while (spfa(ss,tt));printf("%d",mincost);
}

【最小费用可行流模板】相关推荐

  1. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  2. 有下界的最小费用可行流2.0(bzoj 3876: [Ahoi2014]支线剧情)

    什么是有下界的最小费用可行流? 平时来讲都是最小费用最大流,也就是在满流的前提条件下费用尽可能的少,而最小费用可行流一般不要求满流,但是每条边都有最小流量要求(比如经过边e(u,v)的流量不能少于4等 ...

  3. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  4. 洛谷 - P4043 [AHOI2014/JSOI2014]支线剧情(最小费用可行流)

    题目链接:点击查看 题目大意:给出一张 n 个点的有向图,每条边都有边权,现在要求将每条边至少遍历一遍,问最小的边权为多少 题目分析:建图时将每条边都设置流量为 [ 1 , inf ] ,就变成最小费 ...

  5. 费用流:最大费用最大流和最小费用最大流(模板)

    主要是思维建边,建有向边,然后跑模板就行了 可以解决KM算法所能解决的问题(完全取代) 可以解决非完备匹配问题中的最大权匹配和最小权匹配,分别对应着最大费用最大流和最小费用最大流 模板: 最大费用最大 ...

  6. P4043 [AHOI2014/JSOI2014]支线剧情(有源汇上下界最小费用可行流)

    传送门 约束每个点至少要经过一次,因此是上下界网络流. 每经过边都需要相应的边权,且要求耗费边权之和最小,因此是最小费用流. 存在多个终点,需要建立汇点 ttt ,因此是有源汇网络流. 即:有源汇上下 ...

  7. 最大流 最小费用最大流模板

    模板从  这里   搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) const int maxn = 1e6 + 10; const int INF = 0x3f3f3f3 ...

  8. 有上下限的最小费用可行流

    例题 BZOJ 3876 题意,有N个点,并且有一些边,每个点必须要经过一次,但是不限经过次数,也就是有下界的情况,且下界为1,现在每次的起点都是1,问至少花费的代价,使得每次从1开始,终点不限的情况 ...

  9. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

最新文章

  1. Java开发知识之Java面相对象
  2. redmine2.4.2 插件安装
  3. 利用反射修改final数据域
  4. 利用解构赋值获取后端特定字段数据
  5. jdk 流合并_JDK 12,合并的收集器和命名的挑战
  6. [渝粤教育] 苏州工艺美术职业技术学院 PPT美化设计 参考 资料
  7. equals 和 == 的区别?知乎转载
  8. 最强战队实力交锋,算法“视”界杯终极一战即将上演
  9. Spark:聚类算法之LDA主题模型算法
  10. linux系统安全加固
  11. 使用虚幻4进行安卓打包
  12. 【深度学习】 图像识别实战 102鲜花分类(flower 102)实战案例
  13. c语言入门自学ppt,c语言基础知识ppt
  14. c 登录窗口 oracle,C语言实现图形界面登陆窗口
  15. 2020.10.25丨全长转录组结构分析之可变剪切、lncRNA预测
  16. 首先,打破一切常规 学习笔记 之四
  17. 天龙八部怀旧服服务器维护,新天龙八部怀旧服游戏2月4日全服更新维护公告
  18. oracle 10g express linux,使用Oracle10g express 版本方案介绍
  19. python的图形界面库wxpython的快速简单使用
  20. 如何开始做一个开源项目?他的亲身经历值得参考

热门文章

  1. [Leetcode][第491题][JAVA][递增子序列][回溯][RK算法]
  2. OpenCv的连通域操作
  3. echart的进阶使用(option)
  4. oracle 虚拟补丁,趋势科技虚拟补丁(Virtual Patch)
  5. wcf 返回图片_wcf http 返回图片
  6. 解决VC不包含stdint.h头文件问题
  7. half-sync/half-async 和 Leader/Followers 模式的主要区别
  8. java第七章jdbc课后简答题_Java周测题08.13
  9. 石子合并问题java,石子合并问题 GarsiaWachs算法
  10. MySQL——基本配置