原题传送门

一眼应该就能看出是费用流

因为每个交叉路口只能通过一次,所以我们进行拆点,连一条流量为1费用为0的边

再按照题目给的边(是单向边)建图

跑一下MCMF就行了

拆点很套路的~

  1. #include <bits/stdc++.h>
  2. #define N 205
  3. #define M 20005
  4. #define inf (1<<30)
  5. #define getchar nc
  6. using namespace std;
  7. inline char nc(){
  8. static char buf[100000],*p1=buf,*p2=buf;
  9. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  10. }
  11. inline int read()
  12. {
  13. register int x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  16. return x*f;
  17. }
  18. inline void write(register int x)
  19. {
  20. if(!x)putchar('0');if(x<0)x=-x,putchar('-');
  21. static int sta[20];register int tot=0;
  22. while(x)sta[tot++]=x%10,x/=10;
  23. while(tot)putchar(sta[--tot]+48);
  24. }
  25. inline int Min(register int a,register int b)
  26. {
  27. return a<b?a:b;
  28. }
  29. struct node{
  30. int to,next,v,c;
  31. }e[(M<<2)+(N<<1)];
  32. int head[N<<1],cnt=1;
  33. inline void add(register int u,register int v,register int val,register int cost)
  34. {
  35. e[++cnt]=(node){v,head[u],val,cost};
  36. head[u]=cnt;
  37. }
  38. int n,m,s,t,maxflow=0,mincost=0;
  39. int vis[N<<1],dist[N<<1];
  40. inline bool spfa()
  41. {
  42. memset(vis,0,sizeof(vis));
  43. memset(dist,0x3f,sizeof(dist));
  44. dist[s]=0;
  45. vis[s]=1;
  46. queue<int> q;
  47. q.push(s);
  48. while(!q.empty())
  49. {
  50. int u=q.front();
  51. q.pop();
  52. vis[u]=0;
  53. for(register int i=head[u];i;i=e[i].next)
  54. {
  55. int v=e[i].to;
  56. if(dist[v]>dist[u]+e[i].c&&e[i].v)
  57. {
  58. dist[v]=dist[u]+e[i].c;
  59. if(vis[v]==0)
  60. {
  61. q.push(v);
  62. vis[v]=1;
  63. }
  64. }
  65. }
  66. }
  67. return dist[t]!=0x3f3f3f3f;
  68. }
  69. inline int dfs(register int u,register int flow)
  70. {
  71. if(u==t)
  72. {
  73. vis[t]=1;
  74. maxflow+=flow;
  75. return flow;
  76. }
  77. int used=0;
  78. vis[u]=1;
  79. for(register int i=head[u];i;i=e[i].next)
  80. {
  81. int v=e[i].to;
  82. if((vis[v]==0||v==t)&&e[i].v&&dist[v]==dist[u]+e[i].c)
  83. {
  84. int tmp=dfs(v,Min(e[i].v,flow-used));
  85. if(tmp)
  86. {
  87. mincost+=e[i].c*tmp;
  88. used+=tmp;
  89. e[i].v-=tmp;
  90. e[i^1].v+=tmp;
  91. }
  92. if(used==flow)
  93. return used;
  94. }
  95. }
  96. return used;
  97. }
  98. inline void MCMF()
  99. {
  100. while(spfa())
  101. {
  102. vis[t]=1;
  103. while(vis[t])
  104. {
  105. memset(vis,0,sizeof(vis));
  106. dfs(s,inf);
  107. }
  108. }
  109. }
  110. int main()
  111. {
  112. n=read(),m=read();
  113. s=1,t=n;
  114. for(register int i=2;i<n;++i)
  115. add(i,i+n,1,0),add(i+n,i,0,0);
  116. for(register int i=1;i<=m;++i)
  117. {
  118. int u=read(),v=read(),cost=read();
  119. if(u==1)
  120. add(u,v,1,cost),add(v,u,0,-cost);
  121. else if(v==n)
  122. add(u+n,v,1,cost),add(v,u+n,0,-cost);
  123. else
  124. add(u+n,v,1,cost),add(v,u+n,0,-cost);
  125. }
  126. MCMF();
  127. write(maxflow),putchar(' '),write(mincost);
  128. return 0;
  129. }

【题解】Luogu P2153 [SDOI2009]晨跑的更多相关文章

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

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

  2. 洛谷 P2153 [SDOI2009]晨跑

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

  3. P2153 [SDOI2009]晨跑

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

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

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

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

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

  6. BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑

    我由衷地为我的朋友高兴.哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的. 好的,说正事吧.请注意,这还是题解.但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹).我们 ...

  7. 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流

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

  8. 1877: [SDOI2009]晨跑

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

  9. bzoj1877: [SDOI2009]晨跑

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

随机推荐

  1. gitlab服务器IP调整后修改domian或ip

    背景 本地搭建的gitlab 服务器,在 /etc/gitlab/gitlab.rb 中 external_url 通常是局域网ip的形式.如下所示 external_url 'http://192. ...

  2. WKWebView实现网页静态资源优先从本地加载

    前言:最近微信的小游戏跳一跳特别的火,顺便也让h5小游戏更加的火热.另外微信小程序,以及支付宝的小程序都是用H5写的.无论是小游戏还是小程序,这些都需要加载更多的资源文件,处理更多的业务.这些都对网页 ...

  3. Laravel使用Form(转载)

    laravel到了5.1.*以上版本,便没有了illuminate/html类库的支持, 我试着把illuminate/html类库加入了laravel5.2,依然没有用, 但是laravelcoll ...

  4. css3奇数偶数的伪属性

    <style> /*奇数*/ ul li:nth-child(odd){ background-color: green; } /*偶数*/ ul li:nth-child(even){ ...

  5. HTML01

    1.什么是HTML?(Hyper Text Markup Language:超文本标记语言) 超文本:功能比普通文本更加强大 标记语言:使用一组标签对内容进行描述的一门语言(它不是编程语言) 2.为什 ...

  6. spring 总结

    控制反转(Inversion of Control) 依赖注入(Dependency Injection) 一.控制反转 1.控制:传统的方式是由程序创建的,写死的, spring 是由spring管 ...

  7. 图->最短路径->多源最短路径(弗洛伊德算法Floyd)

    文字描述 求每一对顶点间的最短路径,可以每次以一个顶点为源点,重复执行迪杰斯特拉算法n次.这样,便可求得每一对顶点之间的最短路径.总的执行时间为n^3.但是还有另外一种求每一对顶点间最短路径的方法,就 ...

  8. python基础(8)-装饰器函数&进阶

    从小例子进入装饰器 统计一个函数执行耗时 原始版本 import time # time模块有提供时间相关函数 def do_something(): print("do_something ...

  9. 附8 zipkin

    一.zipkin作用 全链路追踪工具(查看依赖关系) 查看每个接口.每个service的执行速度(定位问题发生点或者寻找性能瓶颈) 二.zipkin工作原理 创造一些追踪标识符(tracingId,s ...

  10. XgBoost推导与总结

    一 .机器学习算法中GBDT和XGBOOST的区别有哪些?(转自知乎https://www.zhihu.com/question/41354392/answer/98658997) xgboost相比 ...