题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26870

思路:由于溢出问题,wa了半天,还以为构图错了呢,查了半天!一看到最大最小问题,就应该想到二分,二分最大距离,然后建图跑最大流验证。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define MAXN 222
  8. #define MAXM 222222
  9. #define inf 1<<30
  10. #define FILL(a,b) memset(a,b,sizeof(a))
  11.  
  12. struct Edge{
  13. int v,cap,next;
  14. }edge[MAXM];
  15.  
  16. int n,D,vs,vt,NV,NE;
  17. int head[MAXN];
  18.  
  19. void Insert(int u,int v,int cap)
  20. {
  21. edge[NE].v=v;
  22. edge[NE].cap=cap;
  23. edge[NE].next=head[u];
  24. head[u]=NE++;
  25.  
  26. edge[NE].v=u;
  27. edge[NE].cap=;
  28. edge[NE].next=head[v];
  29. head[v]=NE++;
  30. }
  31.  
  32. int level[MAXN],gap[MAXN];
  33. void bfs(int vt)
  34. {
  35. FILL(level,-);
  36. FILL(gap,);
  37. queue<int>que;
  38. que.push(vt);
  39. level[vt]=;
  40. gap[]++;
  41. while(!que.empty()){
  42. int u=que.front();
  43. que.pop();
  44. for(int i=head[u];i!=-;i=edge[i].next){
  45. int v=edge[i].v;
  46. if(level[v]!=-)continue;
  47. level[v]=level[u]+;
  48. gap[level[v]]++;
  49. que.push(v);
  50. }
  51. }
  52. }
  53.  
  54. int pre[MAXN],cur[MAXN];
  55. int SAP(int vs,int vt)
  56. {
  57. bfs(vt);
  58. memcpy(cur,head,sizeof(head));
  59. int u=pre[vs]=vs,aug=inf,maxflow=;
  60. gap[]=NV;
  61. while(level[vs]<NV){
  62. bool flag=false;
  63. for(int &i=cur[u];i!=-;i=edge[i].next){
  64. int v=edge[i].v;
  65. if(edge[i].cap>&&level[u]==level[v]+){
  66. flag=true;
  67. aug=min(aug,edge[i].cap);
  68. pre[v]=u;
  69. u=v;
  70. if(v==vt){
  71. maxflow+=aug;
  72. for(u=pre[u];v!=vs;v=u,u=pre[u]){
  73. edge[cur[u]].cap-=aug;
  74. edge[cur[u]^].cap+=aug;
  75. }
  76. aug=inf;
  77. }
  78. break;
  79. }
  80. }
  81. if(flag)continue;
  82. int minlevel=NV;
  83. for(int i=head[u];i!=-;i=edge[i].next){
  84. int v=edge[i].v;
  85. if(edge[i].cap>&&level[v]<minlevel){
  86. minlevel=level[v];
  87. cur[u]=i;
  88. }
  89. }
  90. if(--gap[level[u]]==)break;
  91. level[u]=minlevel+;
  92. gap[level[u]]++;
  93. u=pre[u];
  94. }
  95. return maxflow;
  96. }
  97.  
  98. struct Node{
  99. int d;
  100. char flag;
  101. }node[MAXN];
  102.  
  103. void Build(int limit)
  104. {
  105. NE=;
  106. vs=,vt=*n+,NV=vt+;
  107. FILL(head,-);
  108. for(int i=;i<=n;i++){
  109. if(node[i].flag=='B')Insert(i,i+n,);
  110. else if(node[i].flag=='S')Insert(i,i+n,);
  111. }
  112. for(int i=;i<=n;i++){
  113. for(int j=i+;j<=n;j++){
  114. if(node[j].d-node[i].d<=limit){
  115. Insert(i+n,j,);
  116. }
  117. }
  118. }
  119. for(int i=;i<=n;i++){
  120. if(node[i].d<=limit)Insert(vs,i,);
  121. if(D-node[i].d<=limit)Insert(i+n,vt,);
  122. }
  123. if(D<=limit)Insert(vs,vt,);
  124. }
  125.  
  126. int main()
  127. {
  128. int _case,t=;
  129. char str[];
  130. scanf("%d",&_case);
  131. while(_case--){
  132. scanf("%d%d",&n,&D);
  133. for(int i=;i<=n;i++){
  134. scanf("%s",str);
  135. sscanf(str,"%c-%d",&node[i].flag,&node[i].d);
  136. }
  137. int low=,high=D,mid,ans;
  138. while(low<=high){
  139. mid=(low+high)>>;
  140. Build(mid);
  141. if(SAP(vs,vt)>=){
  142. ans=mid;
  143. high=mid-;
  144. }else
  145. low=mid+;
  146. }
  147. printf("Case %d: %d\n",t++,ans);
  148. }
  149. return ;
  150. }

loj 1156(二分+最大流)的更多相关文章

  1. loj 1167(二分+最大流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26881 思路:我们可以二分最大危险度,然后建图,由于每个休息点只能 ...

  2. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  3. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  4. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  5. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

  6. hdu4560 不错的建图,二分最大流

    题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  7. POJ3228二分最大流

    题意:       有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路:       ...

  8. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  9. BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图

    这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...

随机推荐

  1. C# 集合扩展快速排序算法

    /// <summary> /// 对集合进行排序,如 /// List<Person> users=new List<Person>(){.......} /// ...

  2. ls -alrth 及ls 详解

    idcdpi  抓包过程中 用了命令  ls   - alrth :命令,所以回头重新学习 ls命令 linux ls和 ll 命令 标签: linuxsocketssolarisbash出版扩展 2 ...

  3. NAT/PAT

    NAT/PAT 编辑 NAT就是网络地址翻译的英文缩写,在路由器上配置NAT服务,可提供公司内100~200人同时上网的服务.不需要Proxy Server,所有的服务都可顺利使用(除Netmeeti ...

  4. ThinkPHP访问不存在的模块跳到404页面

    在ACTION中新建一个文件EmptyAction.class.php,文件中的代码如下: <?php class EmptyAction extends Action{     functio ...

  5. cocos基础教程(4)基础概念介绍

    在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...

  6. 在C#中开启事务

    1.为什么要开启事务: 举一个简单的例子:在银行业务中,有一条记账原则,即又借有贷.为了保证这种原则,每发生一笔银行业务,就必须保证会计账目上借方科目和贷方科目至少个少一笔,并且这两笔要么同时成功,要 ...

  7. KMP算法精髓

    这个算法的做法就是在部分匹配的时候,常规想法是向后移动一位,但是KMP想法是向后移动n位(n=m-L). 注释:这里m表示已经匹配了的字符的个数,L表示已经匹配了的那些字符组成的这个字符串的前缀和后缀 ...

  8. Phpstorm常用设置

    Phpstorm更换主题和字体 1.File -- settings -- Editor -- Colors And Fonts: 2.在右侧窗口中选择Scheme name : 选择一个自己喜欢的主 ...

  9. angular 监听ng-repeat结束时间

    有些时候我们想要监听angular js中的 ng-repeat结束事件,从而好初始化一些我们的第三方或者其他需要初始化的js. 我们可以这样处理: js 中这样定义 : //监听事件 是否加载完毕a ...

  10. NYOJ 5 字符串处理 find()函数应用

    http://acm.nyist.net/JudgeOnline/problem.php?pid=5 #include<stdio.h> #include<iostream> ...