题面:

传送门

思路:

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

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

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

怎么构造呢?

对于每个点只能走一次的限制,可以考虑拆点,将每个点(除了起点和终点)拆成两个,中间连一条容量为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. 破解 D-H 协议

    756: 破解 D-H 协议 时间限制: 1 Sec  内存限制: 128 MB提交: 78  解决: 18[提交] [状态] [讨论版] [命题人:admin] 题目描述 Diffie-Hellma ...

  2. python_42_文件补充

    m=['红烧肉\n','熘肝尖','西红柿炒鸡蛋','腊八粥','油焖大虾'] fname=input("请输入文件名:")#输入xxx f=open(fname,'w',enco ...

  3. iOS常用第三方类库 Xcode插件

    第三方类库(github地址): 1.AFNetworking 网络数据     https://github.com/AFNetworking/AFNetworking 2.SDWebImage 图 ...

  4. ASP.NET Core模块化前后端分离快速开发框架介绍之1、开篇

    源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...

  5. Linux基础-Linux常用命令

    Linux(/'lainʌks/)系统特点:稳定,安全,开源(一切皆文件) 装上SSH协议就可以连接Linux 装虚拟机(SSH) win用xshell工具 Linux命令:每日一个linux命令 p ...

  6. Python_三级目录

    程序要求: 1. 使用字典存储 1. 可以一层一层的进入到所有层2. 可以在每层返回上一层3. 可以在任意层退出 三级目录写了两个版本,第一个版本是刚看完字典写出来的,代码很多冗余,很多重复. men ...

  7. Centos7多内核情况下修改默认启动内核方法

    1.1  进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...

  8. MQTT的学习之Mosquitto发布-订阅(2)

    在<MQTT的学习之Mosquitto安装&使用(1)>一文末尾,我已经模拟了发布-订阅模式,只是那时在服务器直接模拟的,并不是java代码模拟的.下面贴出Java代码 1.首先引 ...

  9. 机顶盒demux的工作原理

    在机顶盒中demux部分相对来说是比较复杂的部分,对于机顶盒软件开发的新手来说通常在这里会遇到一些困难,今天特意研究了一下驱动层代码,有一点自己的理解,因此写下来记录一下学习过程. 机顶盒中数据是如何 ...

  10. kuangbin 并查集

    A : Wireless Network  POJ - 2236 题意:并查集,可以有查询和修复操作 题解:并查集 #include<iostream> #include<cstdi ...