[费用流]Bzoj P1877 晨跑
Description
Input
Output
两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。
Sample Input
1 2 1
1 3 1
2 4 1
3 4 1
4 5 1
4 6 1
2 5 5
3 6 6
5 7 1
6 7 1
Sample Output
题解
- 拆点费用流
- 我们可以把一个点拆成i和i+n
- 由于每个点只能到达一次,i向i+n连边,容量为1,费用为0
- 然后按照题目描述的建图,从起点的i+n(出点)向终点的i(入点)连边,每条边的长度即为费用
- 注意这里的边的容量也应该为1,因为有可能从1直接到n
- 从源点向s+n连边,从n向汇点连边,容量都为INF,费用为0
代码
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=1001;
const int inf=0x3f3f3f3f;
int n,m,S,cnt,last[N],t,dis[N],f[N],d[N],ans1,ans2,s,v[N],q[N];
struct edge{int from,to,c,w,next,op;}e[N*N*2];
queue<int> Q;
void insert(int u,int v,int x,int y)
{e[++cnt].from=u; e[cnt].to=v; e[cnt].c=x; e[cnt].w=y; e[cnt].next=last[u]; last[u]=cnt; e[cnt].op=cnt+1;e[++cnt].from=v; e[cnt].to=u; e[cnt].c=0; e[cnt].w=-y; e[cnt].next=last[v]; last[v]=cnt; e[cnt].op=cnt-1;
}
bool spfa()
{for (int i=s;i<=t;i++){dis[i]=inf;v[i]=0;}int head=0,tail=1;q[1]=s; v[s]=1; dis[s]=0;while (head!=tail){if (head==1000) head=0;head++;int now=q[head],i=last[now];while (i){if (e[i].c&&dis[now]+e[i].w<dis[e[i].to]){dis[e[i].to]=dis[now]+e[i].w;d[e[i].to]=i;if (!v[e[i].to]){v[e[i].to]=1;if (tail==1000) tail=0;tail++;q[tail]=e[i].to;}}i=e[i].next;}v[now]=0;}if (dis[t]==inf) return 0;return 1;
}
void mcf()
{int mn=inf,x=t;while (d[x]){mn=min(mn,e[d[x]].c);x=e[d[x]].from;}ans1++;x=t;while (d[x]){e[d[x]].c-=mn;e[e[d[x]].op].c+=mn;ans2+=e[d[x]].w*mn;x=e[d[x]].from;}
}
int main()
{scanf("%d%d",&n,&m);s=1; t=n+n;for (int i=0;i<m;i++){int u,v,c;scanf("%d%d%d",&u,&v,&c);insert(u+n,v,1,c);}for (int i=2;i<n;i++) insert(i,i+n,1,0);insert(s,s+n,inf,0); insert(n,t,inf,0);while (spfa()) mcf();printf("%d %d\n",ans1,ans2);return 0;
}
转载于:https://www.cnblogs.com/Comfortable/p/9211047.html
[费用流]Bzoj P1877 晨跑相关推荐
- 2020牛客多校第1场H-Minimum-cost Flow-最小费用流
https://ac.nowcoder.com/acm/contest/5666/H 题目大意:给出了每一条边的费用,有q个询问,问当每一条边的容量为u/v时,通过1流量的最小费用是多少. 思路:很明 ...
- UOJ #455.【UER #8】雪灾与外卖 堆模拟费用流
题意 有n个人和m家商店,每个人都要买一道菜.第i个人的坐标是a[i],第j家商店的坐标是y[i],有c[i]道菜且每道菜价格为w[i],每个人还要花费其到商店距离的路费,问最小花费. n,m≤105 ...
- 【BZOJ 1877】 [SDOI2009]晨跑(费用流)
题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...
- P2153 晨跑,费用流裸题
晨跑 题目连接 https://www.luogu.org/problemnew/show/P2153 题解 求最大不相交路径数,并在路径数最大前提下,求总路程最短. 太裸了. 求不相交路径数:将除1 ...
- bzoj1877 [SDOI2009]晨跑 费用流
注意这个题要求每个点也只经过一次,所以直接复制点就行了 其他的都和普通费用流一样了 码: #include<iostream> #include<cstdio> #includ ...
- BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- BZOJ 4946: [Noi2017]蔬菜 模拟费用流
title BZOJ 4946 LUOGU 3826 简化题意: 定义了一种蔬菜为:\(ai,si,ci,xi\),意思是蔬菜的价格为 \(a_i\),第一份卖出时价格为 \(a_i+s_i\),一共 ...
- BZOJ 1061费用流
思路: 我们可以列出几个不等式 用y0带进去变成等式 下-上 可以消好多东西 我们发现 等式左边的加起来=0 可以把每个方程看成一个点 正->负 连边 跑费用流即可 //By SiriusRen ...
最新文章
- python 公司年会抽奖_用Python做个年会抽奖小程序吧
- Parsing XML in J2ME
- oracle主机名的脚本,一个开启Oracle服务和更改主机名的脚本-Oracle
- SpringBoot——slf4j+logback日志处理及配置详解
- 排序算法 —— 计数排序
- 如何把项目部署到云服务器上,如何把项目部署到云主机
- SimpleDet: 一套简单通用的目标检测与物体识别框架
- 10 python 扩展
- python读取txt文件中的数字_在python中从文本文件读取两列数字
- Linux安装MATLAB Compiler Runtime操作
- Mac最好用的RSS阅读器Reeder使用方法
- PB中导入EXCEL数据
- 网站机房:DDOS防火墙在企业机房中的应用介绍
- 奇怪的消费者心理:看三个趣味经济学原理
- 一起读论文 | 文本分类任务的BERT微调方法论
- 如何删除word中的长横线(由三个减号---自动生成)
- 阿里云培训-负载均衡(CLB/ALB)
- im即时通讯消息id的设计
- 2019.06.17
- iOS 抽取app中的图片图标资源
热门文章
- python pygame sdl2教程_无法安装pygame sdl2
- java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0特殊字符表达
- 江西省普通高考2021艺术楼统考成绩查询,统考成绩查询
- 【Jetty】Jetty 的工作原理以及与 Tomcat 的比较
- Java集合类学习总结
- python开发面向对象基础:封装
- Web安全之点击劫持
- Git_从远程库克隆
- 【转】处事22计、心态24条、伤心50句、礼仪73、学会长大20!
- PowerDesigner物理模型用法总结