题面:

传送门

思路:

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

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

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

怎么构造呢?

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

    ''' 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  2. WebAppBuilder独立于portal之arcgis for js应用框架研究之二

    WAB采用ArcGIS JavaScript for API作为地图开发底层,采用Web AppBuilder作为开发框架,利用该框架即拿即用的Widget来构建应用,比如制图.查询.地理处理.编辑. ...

  3. 1025: [SCOI2009]游戏

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2727  Solved: 1794[Submit][Status][Discuss] Descripti ...

  4. 3- vue django restful framework 打造生鲜超市 - model设计和资源导入

    3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework) ...

  5. MVP模式与MVVM模式

    1.mvp模式(Model层 Presenter层 View 层) Model层 :数据层(ajax请求) Presenter层:呈现层,view逻辑相关的控制层,控制层可以去调Model去发ajax ...

  6. json数据格式及json格式化工具推荐

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据. 易于人阅读和编写,同时也易于机器解析和生成. XML也 ...

  7. PHP 批量操作 Excel

    自己封装了一个批量操作excel文件的方法,通过xls文件地址集合遍历,第三个参数传入一个匿名函数用于每个需求的不同进行的操作,实例中我想要得到列表中含有折字的行,封装成sql语句返回. xls文件超 ...

  8. 数据分析处理库Pandas——索引

    显示DataFrame结构中的指定列 使用iloc索引 指定一行的信息 指定多行信息 备注:第[1,5)行信息. 指定行和列 备注:第[0,5)行中第[1,3)列信息. 使用loc索引 指定行信息 备 ...

  9. 使用jieba和wordcloud进行中文分词并生成《悲伤逆流成河》词云

    因为词云有利于体现文本信息,所以我就将那天无聊时爬取的<悲伤逆流成河>的评论处理了一下,生成了词云. 关于爬取影评的爬虫大概长这个样子(实际上是没有爬完的): #!/usr/bin/env ...

  10. Linux文件属性之文件权限介绍

    1)用ls -li 查看文件列表字段 红色代表的是inode 黄色代表的是文件权限 黄色里面的第一个 - 表示文件的类型(普通类型文件) d 表示目录(directory) l 表示链接文件(link ...