[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 ...
随机推荐
- python_68_迭代器
''' 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- WebAppBuilder独立于portal之arcgis for js应用框架研究之二
WAB采用ArcGIS JavaScript for API作为地图开发底层,采用Web AppBuilder作为开发框架,利用该框架即拿即用的Widget来构建应用,比如制图.查询.地理处理.编辑. ...
- 1025: [SCOI2009]游戏
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1794[Submit][Status][Discuss] Descripti ...
- 3- vue django restful framework 打造生鲜超市 - model设计和资源导入
3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework) ...
- MVP模式与MVVM模式
1.mvp模式(Model层 Presenter层 View 层) Model层 :数据层(ajax请求) Presenter层:呈现层,view逻辑相关的控制层,控制层可以去调Model去发ajax ...
- json数据格式及json格式化工具推荐
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据. 易于人阅读和编写,同时也易于机器解析和生成. XML也 ...
- PHP 批量操作 Excel
自己封装了一个批量操作excel文件的方法,通过xls文件地址集合遍历,第三个参数传入一个匿名函数用于每个需求的不同进行的操作,实例中我想要得到列表中含有折字的行,封装成sql语句返回. xls文件超 ...
- 数据分析处理库Pandas——索引
显示DataFrame结构中的指定列 使用iloc索引 指定一行的信息 指定多行信息 备注:第[1,5)行信息. 指定行和列 备注:第[0,5)行中第[1,3)列信息. 使用loc索引 指定行信息 备 ...
- 使用jieba和wordcloud进行中文分词并生成《悲伤逆流成河》词云
因为词云有利于体现文本信息,所以我就将那天无聊时爬取的<悲伤逆流成河>的评论处理了一下,生成了词云. 关于爬取影评的爬虫大概长这个样子(实际上是没有爬完的): #!/usr/bin/env ...
- Linux文件属性之文件权限介绍
1)用ls -li 查看文件列表字段 红色代表的是inode 黄色代表的是文件权限 黄色里面的第一个 - 表示文件的类型(普通类型文件) d 表示目录(directory) l 表示链接文件(link ...