洛谷 P2153 [SDOI2009]晨跑
题目描述
Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以 在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。
存在的边存在。这种情况下,这条边只能走一次。
输入输出格式
输入格式:
第一行:两个数N,M。表示十字路口数和街道数。 接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。
输出格式:
两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。
输入输出样例
- 7 10
- 1 2 1
- 1 3 1
- 2 4 1
- 3 4 1
- 4 5 1
- 4 6 1
- 2 5 5
- 3 6 6
- 5 7 1
- 6 7 1
- 2 11
说明
对于30%的数据,N ≤ 20,M ≤ 120。
对于100%的数据,N ≤ 200,M ≤ 20000。
最小费用最大流
题目中限制了只能通过一个点一次
所以就把一个点拆成入点和出点 ,中间容量为1,费用为0
1,N 必须通过 所以容量为inf ,费用为0
然后跑模板
天数就是最大流量,路程就是费用
- #include <ctype.h>
- #include <cstdio>
- #include <queue>
- #define Max 80000
- #define inf 0x7fffffff
- using namespace std;
- void read(int &x)
- {
- x=;bool f=;
- register char ch=getchar();
- for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=;
- for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
- x=f?(~x)+:x;
- }
- struct Edge
- {
- int next,to,dis,limit;
- Edge (int next=,int to=,int limit=,int dis=) : next(next),to(to),limit(limit),dis(dis) {}
- }edge[Max<<];
- bool vis[Max];
- int answer,dist,flow[Max],N,M,head[Max],dis[Max],fa[Max],cnt=;
- void insert(int u,int v,int w,int l)
- {
- edge[++cnt]=Edge(head[u],v,w,l);
- head[u]=cnt;
- }
- bool spfa(int s,int t)
- {
- for(int i=;i<=N*N;i++) {dis[i]=inf;flow[i]=inf;vis[i]=;}
- vis[s]=;
- dis[s]=fa[s]=;
- queue<int>Q;
- Q.push(s);
- while(!Q.empty())
- {
- int now=Q.front();
- Q.pop();
- vis[now]=;
- for(int i=head[now];i;i=edge[i].next)
- {
- int v=edge[i].to;
- if(dis[v]>dis[now]+edge[i].dis&&edge[i].limit>)
- {
- dis[v]=dis[now]+edge[i].dis;
- fa[v]=i;
- flow[v]=min(flow[now],edge[i].limit);
- if(!vis[v])
- {
- vis[v]=;
- Q.push(v);
- }
- }
- }
- }
- return dis[t]<inf;
- }
- void dinic(int s,int t)
- {
- for(;spfa(s,t);)
- {
- answer++;
- int x=flow[t];
- for(int i=t;i!=s&&i;i=edge[fa[i]^].to)
- {
- edge[fa[i]].limit-=x;
- edge[fa[i]^].limit+=x;
- }
- dist+=x*dis[t];
- }
- }
- int main()
- {
- read(N);
- read(M);
- insert(,+N,inf,);
- insert(+N,,,);
- insert(N,N+N,inf,);
- insert(N+N,N,,);
- for(int i=;i<N;i++)
- {
- insert(i,i+N,,);
- insert(i+N,i,,);
- }
- for(int a,b,c;M--;)
- {
- read(a);
- read(b);
- read(c);
- insert(a+N,b,,c);
- insert(b,a+N,,-c);
- }
- dinic(,N);
- printf("%d %d",answer,dist);
- return ;
- }
洛谷 P2153 [SDOI2009]晨跑的更多相关文章
- 洛谷$P2153\ [SDOI2009]$ 晨跑 网络流
正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下$QwQ$.就说有$n$个节点$m$条边,然后要求每次走的路径都不一样,问最多能走多少次,然后在次数最多的前提下问路径最短是多少$ ...
- P2153 [SDOI2009]晨跑(最小费用最大流)
题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...
- 【题解】Luogu P2153 [SDOI2009]晨跑
原题传送门 一眼应该就能看出是费用流 因为每个交叉路口只能通过一次,所以我们进行拆点,连一条流量为1费用为0的边 再按照题目给的边(是单向边)建图 跑一下MCMF就行了 拆点很套路的~ #includ ...
- P2153 [SDOI2009]晨跑
思路 典型的最小费用最大流问题,拆点,每个点对应的入点和出点之间连一条cap=1的边表示只能经过一次的限制条件 然后其他边从u的出点连向v的入点即可 代码 #include <cstdio> ...
- 1877: [SDOI2009]晨跑
1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2007 Solved: 1085[Submit][Status][ ...
- BZOJ 1877: [SDOI2009]晨跑 费用流
1877: [SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一 ...
- bzoj1877: [SDOI2009]晨跑
挺裸的最小费用最大流... #include<cstdio> #include<queue> #include<cstring> #include<iostr ...
- BZOJ 1877: [SDOI2009]晨跑( 最小费用最大流 )
裸的费用流...拆点, 流量限制为1, 最后的流量和费用即答案. ------------------------------------------------------------------- ...
- BZOJ_1877_[SDOI2009]晨跑_费用流
BZOJ_1877_[SDOI2009]晨跑_费用流 题意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出 ...
随机推荐
- Java中文&编码问题小结
转自:http://www.blogjava.net/zhugf000/archive/2005/10/09/15068.html Java字符编码转换过程说明 常见问题 JVM JVM启动后,JVM ...
- [Selenium] Selenium私房菜(新手入门教程)
http://wenku.baidu.com/link?url=JrHF9o0mKWcpEsE-wijcZaneBWgpmAJPRwGyWXd7RvqzJCLLrsrsv5lf9bPRmgKUa_v- ...
- NOIP2008 传纸条(DP及滚动数组优化)
传送门 这道题有好多好多种做法呀……先说一下最暴力的,O(n^4的做法) 我们相当于要找两条从左上到右下的路,使路上的数字和最大.所以其实路径从哪里开始走并不重要,我们就直接假设全部是从左上出发的好啦 ...
- vue 组件 props 和event
组件是可扩展的HTML元素,封装可重用的代码. 使用祖册的组件,要确保在初初始化根实例之前注册组件 注册的组件中,data必须是函数 父组件通过props向子组件传递数据,子组件通过事件events给 ...
- 移动端网页巧用 margin和padding 的百分比实现自适应
一个基础却又容易混淆的css知识点 本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素 ...
- UVa11077
dp+置换 可以把排列分成几个循环,然后dp统计 dp[i][j]=dp[i-1][j-1]*(i-1)+dp[i-1][j],表示当前有i个元素,至少换j次,然后如果不在自己应该在的位置有i-1种情 ...
- JS获取子节点、父节点和兄弟节点的方法实例总结
转自:https://www.jb51.net/article/143286.htm 本文实例讲述了JS获取子节点.父节点和兄弟节点的方法.分享给大家供大家参考,具体如下: 一.js获取子节点的方式 ...
- 设计模式——模板模式(Template Pattern)
在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...
- 洛谷 - P1337 - 平衡点/吊打XXX
一眼看过去以为是模拟退火/随机增量之类的.感觉先跑个凸包,然后在凸包内随机转移. 根据力臂长度*重量计算每个方向的分力?判断一个点比原来的点更平衡,是指他们的合力更接近0?每次判断要遍历一次,使用n的 ...
- ObjectARX学习笔记
http://blog.csdn.net/jangdong/article/category/1642265/3 http://blog.csdn.net/u011331383/article/cat ...