题目描述

Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以 在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。

存在的边存在。这种情况下,这条边只能走一次。

输入输出格式

输入格式:

第一行:两个数N,M。表示十字路口数和街道数。 接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。

输出格式:

两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。

输入输出样例

输入样例#1:

  1. 7 10
  2. 1 2 1
  3. 1 3 1
  4. 2 4 1
  5. 3 4 1
  6. 4 5 1
  7. 4 6 1
  8. 2 5 5
  9. 3 6 6
  10. 5 7 1
  11. 6 7 1
输出样例#1:

  1. 2 11

说明

对于30%的数据,N ≤ 20,M ≤ 120。

对于100%的数据,N ≤ 200,M ≤ 20000。

最小费用最大流

题目中限制了只能通过一个点一次

所以就把一个点拆成入点和出点 ,中间容量为1,费用为0

1,N 必须通过 所以容量为inf ,费用为0

然后跑模板

天数就是最大流量,路程就是费用

屠龙宝刀点击就送

  1. #include <ctype.h>
  2. #include <cstdio>
  3. #include <queue>
  4. #define Max 80000
  5. #define inf 0x7fffffff
  6. using namespace std;
  7. void read(int &x)
  8. {
  9. x=;bool f=;
  10. register char ch=getchar();
  11. for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=;
  12. for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
  13. x=f?(~x)+:x;
  14. }
  15. struct Edge
  16. {
  17. int next,to,dis,limit;
  18. Edge (int next=,int to=,int limit=,int dis=) : next(next),to(to),limit(limit),dis(dis) {}
  19. }edge[Max<<];
  20. bool vis[Max];
  21. int answer,dist,flow[Max],N,M,head[Max],dis[Max],fa[Max],cnt=;
  22. void insert(int u,int v,int w,int l)
  23. {
  24. edge[++cnt]=Edge(head[u],v,w,l);
  25. head[u]=cnt;
  26. }
  27. bool spfa(int s,int t)
  28. {
  29. for(int i=;i<=N*N;i++) {dis[i]=inf;flow[i]=inf;vis[i]=;}
  30. vis[s]=;
  31. dis[s]=fa[s]=;
  32. queue<int>Q;
  33. Q.push(s);
  34. while(!Q.empty())
  35. {
  36. int now=Q.front();
  37. Q.pop();
  38. vis[now]=;
  39. for(int i=head[now];i;i=edge[i].next)
  40. {
  41. int v=edge[i].to;
  42. if(dis[v]>dis[now]+edge[i].dis&&edge[i].limit>)
  43. {
  44. dis[v]=dis[now]+edge[i].dis;
  45. fa[v]=i;
  46. flow[v]=min(flow[now],edge[i].limit);
  47. if(!vis[v])
  48. {
  49. vis[v]=;
  50. Q.push(v);
  51. }
  52. }
  53. }
  54. }
  55. return dis[t]<inf;
  56. }
  57. void dinic(int s,int t)
  58. {
  59. for(;spfa(s,t);)
  60. {
  61. answer++;
  62. int x=flow[t];
  63. for(int i=t;i!=s&&i;i=edge[fa[i]^].to)
  64. {
  65. edge[fa[i]].limit-=x;
  66. edge[fa[i]^].limit+=x;
  67. }
  68. dist+=x*dis[t];
  69. }
  70. }
  71. int main()
  72. {
  73. read(N);
  74. read(M);
  75. insert(,+N,inf,);
  76. insert(+N,,,);
  77. insert(N,N+N,inf,);
  78. insert(N+N,N,,);
  79. for(int i=;i<N;i++)
  80. {
  81. insert(i,i+N,,);
  82. insert(i+N,i,,);
  83. }
  84. for(int a,b,c;M--;)
  85. {
  86. read(a);
  87. read(b);
  88. read(c);
  89. insert(a+N,b,,c);
  90. insert(b,a+N,,-c);
  91. }
  92. dinic(,N);
  93. printf("%d %d",answer,dist);
  94. return ;
  95. }

洛谷 P2153 [SDOI2009]晨跑的更多相关文章

  1. 洛谷$P2153\ [SDOI2009]$ 晨跑 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下$QwQ$.就说有$n$个节点$m$条边,然后要求每次走的路径都不一样,问最多能走多少次,然后在次数最多的前提下问路径最短是多少$ ...

  2. P2153 [SDOI2009]晨跑(最小费用最大流)

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

  3. 【题解】Luogu P2153 [SDOI2009]晨跑

    原题传送门 一眼应该就能看出是费用流 因为每个交叉路口只能通过一次,所以我们进行拆点,连一条流量为1费用为0的边 再按照题目给的边(是单向边)建图 跑一下MCMF就行了 拆点很套路的~ #includ ...

  4. P2153 [SDOI2009]晨跑

    思路 典型的最小费用最大流问题,拆点,每个点对应的入点和出点之间连一条cap=1的边表示只能经过一次的限制条件 然后其他边从u的出点连向v的入点即可 代码 #include <cstdio> ...

  5. 1877: [SDOI2009]晨跑

    1877: [SDOI2009]晨跑 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2007  Solved: 1085[Submit][Status][ ...

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

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

  7. bzoj1877: [SDOI2009]晨跑

    挺裸的最小费用最大流... #include<cstdio> #include<queue> #include<cstring> #include<iostr ...

  8. BZOJ 1877: [SDOI2009]晨跑( 最小费用最大流 )

    裸的费用流...拆点, 流量限制为1, 最后的流量和费用即答案. ------------------------------------------------------------------- ...

  9. BZOJ_1877_[SDOI2009]晨跑_费用流

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

随机推荐

  1. Java中文&编码问题小结

    转自:http://www.blogjava.net/zhugf000/archive/2005/10/09/15068.html Java字符编码转换过程说明 常见问题 JVM JVM启动后,JVM ...

  2. [Selenium] Selenium私房菜(新手入门教程)

    http://wenku.baidu.com/link?url=JrHF9o0mKWcpEsE-wijcZaneBWgpmAJPRwGyWXd7RvqzJCLLrsrsv5lf9bPRmgKUa_v- ...

  3. NOIP2008 传纸条(DP及滚动数组优化)

    传送门 这道题有好多好多种做法呀……先说一下最暴力的,O(n^4的做法) 我们相当于要找两条从左上到右下的路,使路上的数字和最大.所以其实路径从哪里开始走并不重要,我们就直接假设全部是从左上出发的好啦 ...

  4. vue 组件 props 和event

    组件是可扩展的HTML元素,封装可重用的代码. 使用祖册的组件,要确保在初初始化根实例之前注册组件 注册的组件中,data必须是函数 父组件通过props向子组件传递数据,子组件通过事件events给 ...

  5. 移动端网页巧用 margin和padding 的百分比实现自适应

    一个基础却又容易混淆的css知识点 本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素 ...

  6. UVa11077

    dp+置换 可以把排列分成几个循环,然后dp统计 dp[i][j]=dp[i-1][j-1]*(i-1)+dp[i-1][j],表示当前有i个元素,至少换j次,然后如果不在自己应该在的位置有i-1种情 ...

  7. JS获取子节点、父节点和兄弟节点的方法实例总结

    转自:https://www.jb51.net/article/143286.htm 本文实例讲述了JS获取子节点.父节点和兄弟节点的方法.分享给大家供大家参考,具体如下: 一.js获取子节点的方式 ...

  8. 设计模式——模板模式(Template Pattern)

    在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...

  9. 洛谷 - P1337 - 平衡点/吊打XXX

    一眼看过去以为是模拟退火/随机增量之类的.感觉先跑个凸包,然后在凸包内随机转移. 根据力臂长度*重量计算每个方向的分力?判断一个点比原来的点更平衡,是指他们的合力更接近0?每次判断要遍历一次,使用n的 ...

  10. ObjectARX学习笔记

    http://blog.csdn.net/jangdong/article/category/1642265/3 http://blog.csdn.net/u011331383/article/cat ...