【最小费用可行流模板】

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

//原图: 对于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);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANSI X9.9 MAC算法介绍

1&#xff09;该算法只使用单倍长密钥&#xff0c;也就是8字节密钥&#xff1b; 2&#xff09;MAC数据按8字节分组&#xff0c;尾部以字节00补齐&#xff1b; 3&#xff09;用MAC密钥加密第一个8字节分组&#xff0c;加密结果与第二个8字节分组异或&#xff0c;然后再用MAC密…

C#.Net使用线程池(ThreadPool)与专用线程(Thread)

线程池(ThreadPool)使用起来很简单&#xff0c;但它有一些限制&#xff1a; 1. 线程池中所有线程都是后台线程&#xff0c;如果进程的所有前台线程都结束了&#xff0c;所有的后台线程就会停止。不能把入池的线程改为前台线 程。 2. 不能给入池的线程设置优先级或名称。 3. 对于…

【Python学习】 - sklearn学习 - 评估指标precision_score的参数说明

函数声明&#xff1a; precision_score(y_true, y_pred, labelsNone, pos_label1, averagebinary, sample_weightNone) 其中较为常用的参数解释如下&#xff1a; y_true&#xff1a;真实标签 y_pred&#xff1a;预测标签 average&#xff1a;评价值的平均值的计算方式。可…

ANSI X9.19 MAC算法介绍

(1) ANSI X9.19MAC算法只使用双倍长密钥&#xff0c;也就是16字节密钥&#xff1b; (2) MAC数据按8字节分组&#xff0c;表示为D0&#xff5e;Dn&#xff0c;如果Dn不足8字节时&#xff0c;尾部以字节00补齐&#xff1b; (3) 用MA…

GitHub.com上的那些东西你都知道什么意思吗?

GitHub初学入门者的图谱&#xff0c;介绍Github网站每个功能的意思 一、键盘快捷键 在GitHub中&#xff0c;很多页面都可以使用键盘快捷键。在各个页面按下“shift /”都可以打开键盘快捷键一览表&#xff0c;如下图&#xff1a; 快捷键 二、工具栏 工具栏 LOGO 点击GitHub…

【Python学习】 - sklearn学习 - 数据集分割方法 - 随机划分与K折交叉划分与StratifiedKFold与StratifiedShuffleSplit

一、随机划分 import numpy as np from sklearn import datasetsiris datasets.load_iris() X iris.data y iris.target# 1&#xff09;归一化前&#xff0c;将原始数据分割 from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test train_t…

CURLE_WRITE_ERROR

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) { return 0; //return size * nmemb; } curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); res curl_easy_perform(curl); 如果应…

Azure 应用服务、虚拟机、Service Fabric 和云服务的比较

Azure 提供了几种托管网站的方式&#xff1a;Azure 应用服务、虚拟机、Service Fabric 和云服务。 本文可帮助你了解这几种方式&#xff0c;并针对 Web 应用程序做出正确的选择。 Azure 应用服务是大多数 Web 应用的最佳选择。 部署和管理都已集成到平台&#xff0c;站点可以快…

【Python学习】 - sklearn - PCA降维相关

1、PCA算法介绍 主成分分析&#xff08;Principal Components Analysis&#xff09;&#xff0c;简称PCA&#xff0c;是一种数据降维技术&#xff0c;用于数据预处理。一般我们获取的原始数据维度都很高&#xff0c;比如1000个特征&#xff0c;在这1000个特征中可能包含了很多…

【Python学习】 - sklearn - 用于生成数据的make_blobs模块

函数原型&#xff1a; sklearn.datasets.make_blobs(n_samples100, n_features2, centers3, cluster_std1.0, center_box(-10.0, 10.0), shuffleTrue, random_stateNone) 参数含义&#xff1a; n_samples: int, optional (default100) The total number of points equally di…

微服务架构及幂等性

微服务架构 微服务架构是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。它的主要作用是将功能分解到离散的各个服务当中&#xff0c;从而降低系统的耦合性&#xff0c;并提供更加灵活的服务支持。 和 微服务 相对应的&#xff0c;这…

【Python学习】 - Matplotlib二维绘图 - plt.matshow()和plt.imshow()区别对比

给定一个8*8的数据&#xff0c;用两种方式分别进行输出。 xx np.zeros((8,8),dtype np.uint8) xx[0,0] 13im Image.fromarray(xx) plt.imshow(im)plt.matshow(xx) plt.show() 输出&#xff1a; 得出结论&#xff1a; 首先我不知道为啥两个窗口是不一样大的。 其次发现图…

表达式主体定义

原文地址https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members 通过表达式主体定义&#xff0c;可采用非常简洁的可读形式提供成员的实现。 只要任何支持的成员&#xff08;如方法或属性&#xff0…

【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化

一、为什么要进行数据归一化 定义&#xff1a;把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程。原则&#xff1a;样本的所有特征&#xff0c;在特征空间中&#xff0c;对样本的距离产生的影响是同级的&#xff1b;问题&#xff1a;特征数字化后&#xff0c;由于取值…

Java中Lambda表达式与方法引用和构造器引用

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/cjhc666/article/details/54948909 方法引用&#xff1a; 首先看 Timer t new Timer(1000, System.…

【基于Python】 - 人工智能机器学习深度学习数据分析 - 常见问题,常用的套路与操作(持续更新)

20200221&#xff1b; 1.做分类问题的时候&#xff0c;给定你标签&#xff0c;你想知道每一类标签的出现频数&#xff0c;可以使用这个函数&#xff1a;np.bincount()。 如果想分析一下数据样本是否均衡的时候&#xff0c;可以考虑这种操作&#xff0c;代码十分简明。 2. 当…

Entity Framework 简介

转贴&#xff1a;链接https://www.cnblogs.com/davidzhou/p/5348637.html 侵删&#xff0c;谢谢 第一篇&#xff1a;Entity Framework 简介 先从ORM说起吧&#xff0c;很多年前&#xff0c;由于.NET的开源组件不像现在这样发达&#xff0c;更别说一个开源的ORM框架&#xff0…

关于C#中的“?”

1. 可空类型修饰符&#xff08;T?&#xff09; 强类型语言中引用类型可以为空&#xff0c;如&#xff1a; string strnull;而你若是定义一个值类型为空&#xff0c;则是会报错的。 然而&#xff0c;在处理数据库和其他包含可能未赋值的元素的数据类型时&#xff0c;我们希望…

【Python学习】 - pyecharts包 - 地图可视化

安装&#xff1a; https://pan.baidu.com/s/1vAlSjVbHt0EDJY6C_38oEA 提取码&#xff1a;t9be 在这个链接中下载对应的.whl文件&#xff0c;放到下图所示的目录中。 然后打开anaconda prompt 找到对应的目录&#xff0c;输入&#xff1a; pip install pyecharts-0.1.9.4-py…

【Python学习】 - anaconda中spyder的常用快捷键总结

熟练spyder中的一些快捷键后&#xff0c;能极大提升code效率。 这里列出常用的快捷键。&#xff08;可以在spyder导航栏Tools-Preferences-Keyboard shortcut中查看有所有的快捷键&#xff09; Tab/ShiftTab:代码缩进/撤销代码缩进 Ctrl1:注释/撤销注释 Ctrl4/5:块注释/撤销块…