[SDOI2009][bzoj1877] 晨跑 [费用流]
题面:
思路:
一个点只能走一回,路径不能相交......
显然可以转化为网络流的决策来做
我们构建一个网络,令其最大流等于最大的跑步天数即可
怎么构造呢?
对于每个点只能走一次的限制,可以考虑拆点,将每个点(除了起点和终点)拆成两个,中间连一条容量为1的边,就可以了
同时,因为要求走的距离最短,那么给每一条原图中的边赋一个费用,把最大流改成费用流即可
这道题有一个值得深思的地方:是题目中的哪个点让你想到要用网络流而不是别的算法来做的?
这道题我实际上是抱着“网络流那么厉害,说不定就做得了”这样的想法
但是肯定不能看到什么题都往每一个算法上面靠,效率太低了
不过有的题在这方面就很明显
例如一些出入口固定的问题,显然就是dp或者网络流(深海机器人,AGC002某题)
实际上,我们见到的题目里面,会明确告诉你算法的题目并不多,而且这种题目一般都比较难
因此还是要培养自己看出算法来的能力啊
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1e9
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,m,cnt=-,first[],dis[],vis[],ans;
struct edge{
int to,next,w,cap;
}a[];
inline void add(int u,int v,int cap,int w){
//cout<<u<<" "<<v<<" "<<cap<<" "<<w<<"\n";
a[++cnt]=(edge){v,first[u],w,cap};first[u]=cnt;
a[++cnt]=(edge){u,first[v],-w,};first[v]=cnt;
}
int q[];
bool spfa(int s,int t){
int i,u,v,head=,tail=;memset(q,,sizeof(q));
for(i=;i<=(n<<);i++) dis[i]=-;memset(vis,,sizeof(vis));
dis[t]=;q[]=t;vis[t]=;
while(head<tail){
u=q[head++];vis[u]=;
//cout<<"spfa "<<u<<" "<<dis[u]<<"\n";
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
//cout<<" to "<<v<<" "<<dis[v]<<" "<<a[i^1].cap<<"\n";
if(!a[i^].cap) continue;
if(~dis[v]&&dis[v]<=dis[u]+a[i^].w) continue;
dis[v]=dis[u]+a[i^].w;
if(!vis[v]){
vis[v]=;
q[tail++]=v;
}
}
}
return ~dis[s];
}
int dfs(int u,int t,int limit){
//cout<<"dfs "<<u<<" "<<t<<" "<<limit<<"\n";
if(u==t||!limit) return limit;
int i,v,f,flow=;vis[u]=;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;if(vis[v]) continue;
if(dis[v]==dis[u]-a[i].w&&(f=dfs(v,t,min(limit,a[i].cap)))){
flow+=f;limit-=f;
a[i].cap-=f;a[i^].cap+=f;
ans+=f*a[i].w;
//cout<<"ans added "<<f*a[i].w<<"\n";
if(!limit) return flow;
}
}
return flow;
}
int mcmf(int s,int t){
int re=,tmp;
while(spfa(s,t)){
vis[t]=;
while(vis[t]){
memset(vis,,sizeof(vis));
re+=dfs(s,t,inf);
}
//cout<<"tmp re "<<re<<"\n";
}
return re;
}
int main(){
freopen("run.in","r",stdin);
freopen("run.out","w",stdout);
memset(first,-,sizeof(first));
int i,t1,t2,t3,t4,S,T;
n=read();m=read();S=;T=n<<;
for(i=;i<n;i++) add(i,i+n,,);
add(,n+,inf,);add(n,(n<<),inf,);
for(i=;i<=m;i++){
t1=read();t2=read();t3=read();
add(t1+n,t2,,t3);
}
printf("%d ",mcmf(S,T));
cout<<ans<<"\n";
}
用了某博主改进的zkw费用流,跑的好快
博主讲的也挺好的,代码注释很全,在这里转一下链接:传送门
[SDOI2009][bzoj1877] 晨跑 [费用流]的更多相关文章
- 【bzoj1877】[SDOI2009]晨跑 费用流
题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...
- BZOJ 1877: [SDOI2009]晨跑 费用流
1877: [SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一 ...
- B1877 [SDOI2009]晨跑 费用流
其实之前写过一个板子,但是一点印象都没有,所以今天重写了一下,顺便把这个题当成板子就行了. 其实费用流就是把bfs换成spfa,但是中间有一个原则,就是费用优先,在费用(就是c)上跑spfa,顺便求出 ...
- BZOJ-1877 晨跑 最小费用最大流+拆点
其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...
- bzoj1877 晨跑(费用流)
1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2138 Solved: 1145 Description Elax ...
- 【BZOJ】【1877】【SDOI2009】晨跑
网络流/费用流 费用流入门题……根本就是模板题好吗! 拆点搞定度数限制,也就是每个点最多经过一次……源点汇点除外. /***************************************** ...
- bzoj1877 晨跑
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...
- 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流
[BZOJ1877][SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现 ...
- HDU4807 Lunch Time(费用流变种)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4807 Description The campus of Nanjing Universit ...
随机推荐
- 2017.12.23 第二章 统一建模语言UML概述
第二章 统一建模语言UML概述 (1)为什么要建模 模型是某个事物的抽象,其目的是在构建这个事物之前先来理解它,因为模型忽略了那些非本质的细节,这样有利于更好的理解和表示事物: 在软件系统开发之前首先 ...
- 解决Jquery中使用each循环时,循环外的js依旧会执行
今天在改项目bug时,发现一个问题,我获取一个div中所有的input,并取值时,判断某一条件,但是循环外的js依然可以执行. $(".tab-reg-next input").e ...
- 微服务SpringCloud+Docker入门到高级实战(目录)
第一章 课程介绍和学习路线 1.微服务架构SpringCloud课程介绍 简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2.技术选型和学后水平 简介:课程所需基础和技术选型讲解,学完课程可以 ...
- 网络流_Edmond-Karp算法、Dinic算法
转载:网络流基础篇——Edmond-Karp算法 BY纳米黑客 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. 汇点:另一个点也很特殊, ...
- OI,我的决心
虽然从初一就开始NOIP,但沉溺于游戏编程等各种乱七八糟的技术,一直没对算法有过透彻的研究. ——————————简单的来说就是水过了—————————— 我生于一个弱省,就读于一所弱校(我们全区的都 ...
- C++ 学习笔记 (八)重载 重写 重定义以及名字覆盖
学习C++必定会遇到重载.重写.重定义.概念的东西多也是学习C++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了. 概念,特点: 重载: 直白点说就是函数名字相同,传参的个数,类型不一样.判断标准在于 ...
- Mysql的一些纪要
unsigned 整型的每一种都分无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如 ...
- Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本
Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...
- ecshop里操作session与cookie
目录 操作session 操作cookie html模板里提交保存用用户名 php里 js里保存cookie js里读取cookie html模板里smart的保留变量 html模板里取session ...
- Linux命令之---nl
命令简介 nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补 ...