题目链接: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. JS实现打字机式字符输出效果

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. 利用memcached构建高性能的Web应用程序(转载)

    面临的问题 对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的边 ...

  3. H2Database数据类型

    数据类型   整数(INT) 布尔型(BOOLEAN) 微整数(TINYINT) 小整数(SMALLINT) 大整数(BIGINT) 标识符(IDENTITY) 货币数(DECIMAL) 双精度实数( ...

  4. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  5. 如何在CentOS 7服务器上安装NodeJS

    你可以通过运行以下命令. 1 sudo yum install epel-release 现在可以使用yum命令安装Node.js了. 1 sudo yum install nodejs 因为在开发过 ...

  6. CF440C

    C. One-Based Arithmetic time limit per test 0.5 seconds memory limit per test 256 megabytes input st ...

  7. linux下Nginx服务器安装教程

    序:Nginx服务器安装总结而已,不是教程. 安装的过程中出现了一些问题,原因我的云主机是纯净版,所以很多依赖包都没有.其中安装过程中就发现perl库缺少和openssl库缺少,因此我手动安装的这两款 ...

  8. 取地址符:&

    例子: <?php $a=10; $b = &$a; echo $b; $b=15; echo $a; //结果:10和15 //当$b = &$a 时,a,b的地址相同,对a, ...

  9. Sed替换行和字符shell

    1.在某一行后面追加一行 RD=2000sed -i '/ssi_types/ a\limit_req zone=lreq burst='$RD';' /opt/bee.location 2.替换字符 ...

  10. Unity3D使用小技巧

    原地址:http://unity3d.9tech.cn/news/2014/0411/40178.html 1.Crtl+f摄像机自动适配场景. 2.可以用一个立方体作为底盘. 3.人物角色可以直接引 ...