管道清洁

201812-5

  • 需要清洁的管道下界为1,
  • 不需要清洁的管道下界为0,
  • 可重复经过的管道上界为正无穷,
  • 不可重复经过的管道上界为1。
  • 这属于无源无汇的有容量下界的最小费用可行流。解决的方法就是首先增加一个源点和一个汇点,然后对每一条有下限的弧进行改造,改成容量下限为0,上限为c-b的一条弧,再增加两条分别从x点指向源点的上限为b的弧,以及从源点指向y点的上限为b的弧。
  • 最后,只需要求改造后的s-t的最小费用流就行了。但是当且仅当附加弧满载时候原网络有可行流。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
using namespace std;
const int N=210;
const int INF=0X3F3F3F3F;
int n,m,e;
int no[N];
int overload;//需要清扫的道路数目
int sum;//根据需要清扫的道路数目可知必须要消耗的包子数目,注意这里仅仅是需要清扫的道路的必须的包子数目,而不是全部的
struct Edge {int from, to, cap, flow, cost;
};
struct MCMF {int n, m;vector<Edge> edges;vector<int> G[N];int d[N], inq[N], p[N], a[N];void init(int n) {this->n = n;for (int i = 0; i <= n; ++i) G[i].clear();edges.clear();}void AddEdge(int from, int to, int cap, int cost) {edges.push_back(Edge{from, to, cap, 0, cost});edges.push_back(Edge{to, from, 0, 0, -cost});m = edges.size();G[from].push_back(m-2); G[to].push_back(m-1);}bool spfa(int s, int t, int &flow, int &cost) {//M(inq, 0); M(d, INF);memset(inq,0,sizeof(inq));memset(d,INF,sizeof(d));d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;queue<int> q;q.push(s);while (!q.empty()) {int x = q.front(); q.pop();inq[x] = 0;for (int i = 0; i < G[x].size(); ++i) {Edge &e = edges[G[x][i]];if (d[e.to] > d[x] + e.cost && e.cap > e.flow) {d[e.to] = d[x] + e.cost;p[e.to] = G[x][i];a[e.to] = min(a[x], e.cap-e.flow);if (inq[e.to]) continue;q.push(e.to); inq[e.to] = 1;}}}if (d[t] == INF) return false;flow += a[t];cost += d[t] * a[t];int u = t;while (u != s) {edges[p[u]].flow += a[t];edges[p[u]^1].flow -= a[t];u = edges[p[u]].from;}return true;}int Mincost(int s, int t) {int flow = 0, cost = 0;while (spfa(s, t, flow, cost));if(flow!=overload)return -1;return cost;}}solver;
int main(){ios::sync_with_stdio(false);cin.tie(0);int t,s;cin>>t>>s>>e;while(t--){overload=0;sum=0;int st,ed;cin>>n>>m;st=0,ed=n+1;memset(no,0,sizeof(no));solver.init(n+1);for(int i=0;i<m;i++){int x,y;char c;cin>>x>>y>>c;if(c=='A'){//需要被清理,可以走无数遍,上限为无穷,下限为1solver.AddEdge(x,y,INF,e);no[x]--;no[y]++;sum+=e;}else if(c=='B'){//需要被清理,只能走一遍,上限为1,下限也为1no[x]--;no[y]++;sum+=e;}else if(c=='C'){//不要被清理,可以走无数遍,上限为无穷,下限为0solver.AddEdge(x,y,INF,e);}else{//不需要被清理,但是只能走一遍,上限为1,下限为0solver.AddEdge(x,y,1,e);}}for(int i=1;i<=n;i++){//因为这里的下限刚好是1,所以可以采用++,--的方法来统计一个顶点共有多少次上限-下限if(no[i]>0){//后结点solver.AddEdge(st,i,no[i],0);//一下两条路属于附加结点,附加边,所以费用是0overload+=no[i];}else if(no[i]<0){//前结点solver.AddEdge(i,ed,-no[i],0);}}cout<<solver.Mincost(st,ed)+sum<<endl;}//system("pause");return 0;
}

转载于:https://www.cnblogs.com/GarrettWale/p/11441918.html

CCF(管道清洁):最小费用最大流相关推荐

  1. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  2. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  3. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  4. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

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

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

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

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

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

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

  8. 【最小费用最大流】Going Home

    概念: 在同一个网络中,可能存在多个总流量相同的最大流,我们可以在计算流量的基础之上,给网络中的弧增加一个单位流量的费用(简称费用),在确保流量最大的前提下总费用最小--最小费用最大流. C - Go ...

  9. 最大流最小费用java_最小费用最大流及算法

    最大流的网络,可看作为辅送一般货物的运输网络,此时,最大流问题仅表明运输网络运输货物的能力,但没有考虑运送货物的费用.在实际问题中,运送同样数量货物的运输方案可能有多个,因此从中找一个输出费用最小的的 ...

最新文章

  1. Java枚举原来还能这么用
  2. std::setprecision、std::ios::fixed使用说明
  3. Dotnet Core
  4. 从Java程序员进阶到架构师,6大核心技能要领详解
  5. CSDN《IT人才成长路线图》重磅开源!60+ 专家,13 个技术领域,绘出 35 张图谱...
  6. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...
  7. 【无广告】一位算法工程师从30+场秋招面试中总结出的超强面经——目标检测篇...
  8. javascript 动态选中option
  9. Java毕业设计-社区疫情防控管理系统
  10. MongoDB安装和批量写入
  11. sin30度用c语言转换弧度制,【数学】弧度和角度的转换
  12. 3月编程排行榜来了~有哪些新看点?
  13. 4.4.4系统不用ROOT激活xposed框架流程
  14. 【微信小程序】微信小程序接口数据加密、解密算法
  15. android计算器实训报告总结,计算机实训总结报告【三篇】
  16. 京剧猫主题曲用计算机弹奏,京剧猫电脑版
  17. 电商之下:服务类商品订单履约系统如何设计
  18. 华为eNSP配置FR 帧中继协议
  19. windows11 版本 business editions consumer editions 区别介绍
  20. FPGA流水灯(间隔1S)

热门文章

  1. zookeeper报错length is greater than jute.maxbuffer=1048575
  2. c++服务端面试个人小结
  3. CodeForces 1457D XOR-gun
  4. 计算机专业英语论文摘要合辑【1】
  5. Python输入与输出(基础篇)
  6. 固体物理 2022.10.15
  7. 控制使用计算机时间怎么解除,Win7本次操作由于这台计算机的限制而被取消怎么办?...
  8. 章鱼网络 Community Call #5|Octopus DAO 即将启动应用链投票
  9. 多线程(MultiThread)——原子性(Atomicity)
  10. CSS自动换行后缩进