1570: [JSOI2008]Blue Mary的旅行

题目:传送门


题解:

   get到拆点新姿势,还是做题太少了...ORZ

   因为每天就只能有一个航班,那就不能直接连了,所以要拆点(然后就被卡住了)

   二分的话肯定是二分天数啦,这个就不说了

   拆点的方法:把每种航班拆成天数+1(太强辣%%%Star_Feel),因为第一个点的编号是1,而到达的天数为0

   那么这时候如果说x机场可以到y机场,那就把x机场的第i天连到y机场的第i+1天就好(代表花费了一天),流量就为机票数。

   特别神奇...然后一通乱check就没了...ORZ%%%

   注意答案求的是第几天,那么check的时候参数是总天数,那么就是mid+1

  


代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define inf 999999999
  7. using namespace std;
  8. struct node
  9. {
  10. int x,y,c,next,other;
  11. }a[];int len,last[];
  12. void ins(int x,int y,int c)
  13. {
  14. int k1,k2;
  15. k1=++len;
  16. a[len].x=x;a[len].y=y;a[len].c=c;
  17. a[len].next=last[x];last[x]=len;
  18.  
  19. k2=++len;
  20. a[len].x=y;a[len].y=x;a[len].c=;
  21. a[len].next=last[y];last[y]=len;
  22.  
  23. a[k1].other=k2;
  24. a[k2].other=k1;
  25. }
  26. int n,m,T,st,ed,head,tail;
  27. int list[],h[];
  28. bool bt_h()
  29. {
  30. memset(h,,sizeof(h));h[st]=;
  31. list[]=st;head=;tail=;
  32. while(head!=tail)
  33. {
  34. int x=list[head];
  35. for(int k=last[x];k;k=a[k].next)
  36. {
  37. int y=a[k].y;
  38. if(h[y]== && a[k].c>)
  39. {
  40. h[y]=h[x]+;
  41. list[tail++]=y;
  42. }
  43. }
  44. head++;
  45. }
  46. if(h[ed]>)return true;
  47. return false;
  48. }
  49. int find_flow(int x,int flow)
  50. {
  51. if(x==ed)return flow;
  52. int s=,t;
  53. for(int k=last[x];k;k=a[k].next)
  54. {
  55. int y=a[k].y;
  56. if(h[y]==h[x]+ && a[k].c> && s<flow)
  57. {
  58. s+=t=find_flow(y,min(a[k].c,flow-s));
  59. a[k].c-=t;a[a[k].other].c+=t;
  60. }
  61. }
  62. if(s==)h[x]=;
  63. return s;
  64. }
  65. struct edge
  66. {
  67. int x,y,c;
  68. }e[];
  69. bool check(int k)
  70. {
  71. len=;memset(last,,sizeof(last));
  72. for(int i=;i<=m;i++)
  73. {
  74. int x=e[i].x,y=e[i].y,c=e[i].c;
  75. for(int j=;j<k;j++)ins((x-)*k+j,(y-)*k+j+,c);
  76. }
  77. st=,ed=n*k+;
  78. for(int i=;i<=k;i++)ins(st,i,T),ins((n-)*k+i,ed,inf);
  79. int ans=;while(bt_h())ans+=find_flow(st,T);
  80. if(ans>=T)return true;
  81. return false;
  82. }
  83. int main()
  84. {
  85. scanf("%d%d%d",&n,&m,&T);for(int i=;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].c);
  86. int l=,r=n*T,ans=;
  87. while(l<=r)
  88. {
  89. int mid=(l+r)>>;
  90. if(check(mid+))ans=mid,r=mid-;
  91. else l=mid+;
  92. }
  93. printf("%d\n",ans);
  94. return ;
  95. }

bzoj1570: [JSOI2008]Blue Mary的旅行(二分+网络流)的更多相关文章

  1. BZOJ 1570: [JSOI2008]Blue Mary的旅行( 二分答案 + 最大流 )

    二分答案, 然后对于答案m, 把地点分成m层, 对于边(u, v), 第x层的u -> 第x+1层的v 连边. 然后第x层的u -> 第x+1层的u连边(+oo), S->第一层的1 ...

  2. BZOJ1570 [JSOI2008]Blue Mary的旅行

    建分层图,每一层表示一天的情况 从S向第0层的1号点连边,每层的n向T连INF的边 枚举天数,每多一天就多建一层然后跑最大流,如果当前流量大于人数则输出答案 由于路径长度不会超过n,因此tot个人走这 ...

  3. 【BZOJ1570】[JSOI2008]Blue Mary的旅行 动态加边网络流

    [BZOJ1570][JSOI2008]Blue Mary的旅行 Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决 ...

  4. bzoj 1570: [JSOI2008]Blue Mary的旅行

    Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买 ...

  5. [JSOI2008]Blue Mary的旅行

    嘟嘟嘟 看\(n\)那么小,就知道是网络流.然后二分,按时间拆点. 刚开始我看成所有航班一天只能起飞一次,纠结了好一会儿.但实际上是每一个航班单独考虑,互不影响. 建图很显然,拆完点后每一个点的第\( ...

  6. 【bzoj1507】 JSOI2008—Blue Mary的旅行

    http://www.lydsy.com/JudgeOnline/problem.php?id=1570 (题目链接) 题意 给出$m$个航班,每天只能做一次飞机,有$T$人从起点到终点,问最晚到达的 ...

  7. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  8. bzoj1567: [JSOI2008]Blue Mary的战役地图

    将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...

  9. 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit ...

随机推荐

  1. linux块设备的IO调度算法和回写机制

    ************************************************************************************** 參考: <Linux ...

  2. 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MBGD

    排版也是醉了见原文:http://www.cnblogs.com/maybe2030/p/5089753.html 在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度 ...

  3. hdoj--2534--Score(gcd)

    Score Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. HIT Software Construction Lab 5_经验总结

    前言: 终于写完lab5了,这次lab5是基于lab3的一次实验,主要是王忠杰老师提供了4个大约有50w行的大文件让我们根据自己所选应用读取其中两个并且创建轨道系统. 这次lab5优化的我很崩溃,因为 ...

  5. Chosen:Select 选择框的华丽变身

    HTML Form 表单里的各种组件,例如文本输入框,textarea,按钮等,都可以通过CSS或其它技术进行美化,让它们看起来很漂亮了,唯独下拉列表选项框(select box),不管你怎么做,它摆 ...

  6. C#测量程序运行时间及cpu使用时间实例方法

    private void ShowRunTime() { TimeSpan ts1 = Process.GetCurrentProcess().TotalProcessorTime; Stopwatc ...

  7. s2sh的MVC执行流程和执行原理

    =======================执行流程 1. 从页面开始,提交表单或者点击链接会触发一个action 2. action交给struts2处理,读取src目录struts.xml文件, ...

  8. ZBrush中如何反选遮罩

    通过对ZBrush的学习,我们知道了如何手动创建遮罩,手动创建遮罩相对来说是最简单有效的方法,在某些特定的使用场合会起到事半功倍的效果.创建遮罩我们可以结合Ctrl键在物体保持编辑的状态下来执行,您可 ...

  9. baidu练习/html/css

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. Django路由中的include

    include(module,namespace = None,app_name = None)[source] include(pattern_list) include((pattern_list ...