CCF201812-5 管道清洁 题解(最小费可行流)
无源汇的最小费可行流。
需要清洁的管道下界为1,不需要清洁的管道下界为0。
可重复经过的管道上界为正无穷,不可重复经过的管道上界为1。
然后建图直接跑最小费用流。
AC代码:
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int maxn = 233;
const int inf = 0x3f3f3f3f;
struct node{int u,v,f,w,nxt;node(){};node(int a,int b,int c,int d,int e):u(a),v(b),f(c),w(d),nxt(e){}
}e[maxn*maxn];
int cnt = 0;
int head[maxn];
void add(int u,int v,int f,int w){e[cnt] = node(u,v,f,w,head[u]);head[u] = cnt++;e[cnt] = node(v,u,0,-w,head[v]);head[v] = cnt++;
}
int st,ed,E,ex;
int n,m;
int du[maxn];
int sum;
int num = 0;
void init(){scanf("%d%d",&n,&m);st = 0;ed = n + 1;ex = n + 2;cnt = 0;sum = 0;num = 0;memset(head,-1,ex<<2);memset(du,0,ex<<2);while(m--){int u,v;char c[2];scanf("%d%d%s",&u,&v,c);if(c[0] == 'A'){add(u,v,inf,E);du[u]--;du[v]++;num+=E;}else if(c[0] == 'B'){du[u]--;du[v]++;num+=E;}else if(c[0] == 'C'){add(u,v,inf,E);}else add(u,v,1,E);}for(int i = 1;i <= n;++i){if(du[i] > 0){sum += du[i];add(st,i,du[i],0);}else if(du[i] < 0){add(i,ed,-du[i],0);}}
}
int pre[maxn];
int flow[maxn];
int inq[maxn];
int dis[maxn];
int spfa(){memset(pre,-1,ex<<2);memset(inq,0,ex<<2);memset(dis,0x3f,ex<<2);queue<int> q;q.push(st);flow[st] = inf;inq[st] = 1;dis[st] = 0;while(q.size()){int u = q.front();q.pop();inq[u] = 0;for(int i = head[u];i != -1; i = e[i].nxt){int v = e[i].v;if(e[i].f && dis[v] > dis[u] + e[i].w){dis[v] = dis[u] + e[i].w;pre[v] = i;flow[v] = min(flow[u],e[i].f);if(!inq[v]) inq[v] = 1,q.push(v);}}}if(pre[ed] == -1) return -1;return flow[ed];
}
int mfmv(){int fw = 0;int ans = 0;int d;while((d = spfa())!=-1){fw += d;ans += dis[ed]*d;int v = ed;while(v!=st){e[pre[v]].f -= d;e[pre[v]^1].f += d;v = e[pre[v]].u;}}if(fw!=sum) return -1;return ans + num;
}
void sol(){int ans = mfmv();printf("%d\n",ans);
}
int main(){int T;cin>>T;cin>>E>>E;//输入的S没有用,不管它while(T--){init();sol();}
}
CCF201812-5 管道清洁 题解(最小费可行流)相关推荐
- CCF201812-5 管道清洁【最小费可行流】(100分题解链接)
试题编号: 201812-5 试题名称: 管道清洁 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 样例输入 3 0 1 4 4 1 2 A 2 3 B 3 4 C 4 1 D 5 7 ...
- CCF(管道清洁):最小费用最大流
管道清洁 201812-5 需要清洁的管道下界为1, 不需要清洁的管道下界为0, 可重复经过的管道上界为正无穷, 不可重复经过的管道上界为1. 这属于无源无汇的有容量下界的最小费用可行流.解决的方法就 ...
- 管道清洁刷的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
本文研究全球与中国市场管道清洁刷的发展现状及未来发展趋势,分别从生产和消费的角度分析管道清洁刷的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的主要厂商产品特点.产品规格.不同规格 ...
- loj#115. 无源汇有上下界可行流
\(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...
- 【bzoj2406】矩阵 二分+有上下界可行流
题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...
- POJ 2396 有上下界的可行流
题意: 有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件: 每一行的数字的和 每一列的数字的和 某些格子有特殊的大小约束,用大于号,小于号和等于号表示 问:是否存在用正数填充这个方阵的方案 ...
- 【zoj2314】Reactor Cooling 有上下界可行流
题目描述 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuc ...
- 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)
题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai,ai+n一个点为入点,一个为出点这条边的流量范围 ...
- 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)
题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...
最新文章
- 面试:HashMap 夺命二十一问!鸡哥都扛不住~
- linux 连接远程命令行,screen命令行远程连接
- springboot-嵌入式Servlet容器(Tomcat)源码分析以及容器切换
- python控制语句第一章_【原创】Python第一章
- 清除被占用的8080端口,否则npm run dev无法正常运行
- crt无法网络连接linux开发板,securceCRT网络连接不正常解决途径
- “尽快成立国家级权威信息安全部门”
- 【Linux网络编程】原始套接字实例:发送 UDP 数据包
- 2018 大湾区(深圳) .NET技术分享交流会 第一期
- 收件服务器信息,收件服务器配置信息
- 微信小程序学习笔记01:微信小程序概述
- 【kafka】kafka topic Dump log
- python3及wxpythonGUI多线程防假死与线程消息传递消息(最新)
- BLE无线信号的调制方式
- 航测无人机测绘地理信息免费资料
- C# 关于浏览器——CefSharp篇
- 超短波视距通信极限距离计算公式
- 平面设计如何做出空间创意作品?
- Linux下安装google浏览器
- acrobat PDF删除部分_PDF编辑器Adobe Acrobat DC 2019