题面:

传送门

思路:

一个点只能走一回,路径不能相交......

显然可以转化为网络流的决策来做

我们构建一个网络,令其最大流等于最大的跑步天数即可

怎么构造呢?

对于每个点只能走一次的限制,可以考虑拆点,将每个点(除了起点和终点)拆成两个,中间连一条容量为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] 晨跑 [费用流]的更多相关文章

  1. 【bzoj1877】[SDOI2009]晨跑 费用流

    题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...

  2. BZOJ 1877: [SDOI2009]晨跑 费用流

    1877: [SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一 ...

  3. B1877 [SDOI2009]晨跑 费用流

    其实之前写过一个板子,但是一点印象都没有,所以今天重写了一下,顺便把这个题当成板子就行了. 其实费用流就是把bfs换成spfa,但是中间有一个原则,就是费用优先,在费用(就是c)上跑spfa,顺便求出 ...

  4. BZOJ-1877 晨跑 最小费用最大流+拆点

    其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...

  5. bzoj1877 晨跑(费用流)

    1877: [SDOI2009]晨跑 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2138  Solved: 1145 Description Elax ...

  6. 【BZOJ】【1877】【SDOI2009】晨跑

    网络流/费用流 费用流入门题……根本就是模板题好吗! 拆点搞定度数限制,也就是每个点最多经过一次……源点汇点除外. /***************************************** ...

  7. bzoj1877 晨跑

    Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...

  8. 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流

    [BZOJ1877][SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现 ...

  9. HDU4807 Lunch Time(费用流变种)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4807 Description The campus of Nanjing Universit ...

随机推荐

  1. 5.1 Object类型

    创建Object实例的方式有两种 ① 使用new操作符跟Object构造函数 var person = new Object(); person.name = "Tom"; pei ...

  2. 运行自己的shell脚本

    shell脚本可以直接./**.sh,也可以bash **.sh 我用./**.sh运行自己写的一个脚本,会出现如下的错误: bnrc@bnrc:~$ ./pixel.sh bash: ./pixel ...

  3. MySQL自学笔记_联结(join)

    1.  背景及原因 关系型数据库的一个基本原则是将不同细分数据放在单独的表中存储.这样做的好处是: 1).避免重复数据的出现 2).方便数据更新 3).避免创建重复数据时出错 例子: 有供应商信息和产 ...

  4. composer 类加载器,对 <PSR-4的风格>、<PSR-0的风格>、<PEAR的风格> 风格的类的加载

    class ClassLoader { // ... /** * composer 类加载器,对 <PSR-4的风格>.<PSR-0的风格>.<PEAR的风格> 风 ...

  5. 5分钟带你快速理解Http协议

    HTTP协议 什么是HTTP协议 HTTP(Hyper Text Transfer Protocol)协议又叫超文本传输协议,是建立在TCP/IP协议之上的用来传递数据的协议.它不涉及数据包的传递,主 ...

  6. 4 Values whose Sum is 0 POJ - 2785

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 29243   Accep ...

  7. Kubernetes master服务定制编译docker镜像

    前言 之前部署了Kubernetes 1.13.0,发现master服务的启动方式与1.10.4版本有所区别,kube-apiserver.kube-controller-manager和kube-s ...

  8. 如何提高STM32的学习效率

    时间如何安排 做任何事情前,习惯写一个计划——要在一个月内上手STM32! 没有计划的日子,每天早上醒来睁开眼睛,却不知道自己今天要干啥 计划和时间安排: 第一阶段:找感觉——谈及STM32,立即反应 ...

  9. 12,scrapy框架之post请求

    今日概要 递归爬取解析多页页面数据 scrapy的post请求发送 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个 ...

  10. 洛谷P1079 Vigenère 密码

    题目链接:https://www.luogu.org/problemnew/show/P1079