题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975

题意:和hdu4888基本一样( http://www.cnblogs.com/a-clown/p/6670043.html ),但是这题的时间限制是1000ms 比较卡时间需要优化。

思路:看学长的代码,用引用优化,加一个&i 这样i的本质就是用来改变head[i]的值,本来head[u]记录的是原图的所有信息,

但现在head[u]一直在靠近最后的点,相当于遍历过一次就不会再继续遍历到这个点了。相当于做了优化,dfs过的点直接剪枝了。

AC代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int MAXN=;
  9. const int MAXM=**;
  10. const int INF=0x3f3f3f3f;
  11.  
  12. struct Edge
  13. {
  14. int to,next,cap,flow;
  15. } edge[MAXM];
  16.  
  17. int tol;
  18. int head[MAXN];
  19. int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];
  20.  
  21. void init()
  22. {
  23. tol=;
  24. memset(head,-,sizeof(head));
  25. }
  26.  
  27. void Addedge(int u,int v,int w,int rw=)
  28. {
  29. edge[tol].to = v;
  30. edge[tol].cap = w;
  31. edge[tol].next = head[u];
  32. edge[tol].flow = ;
  33. head[u] = tol++;
  34.  
  35. edge[tol].to = u;
  36. edge[tol].cap = rw;
  37. edge[tol].next = head[v];
  38. edge[tol].flow = ;
  39. head[v]=tol++;
  40. }
  41.  
  42. int sap(int start,int end,int N)
  43. {
  44. memset(gap,,sizeof(gap));
  45. memset(dep,,sizeof(dep));
  46. memcpy(cur,head,sizeof(head));
  47. int u=start;
  48. pre[u]=-;
  49. gap[]=N;
  50. int ans=;
  51. while(dep[start]<N)
  52. {
  53. if(u==end)
  54. {
  55. int Min=INF;
  56. for(int i=pre[u]; i!=-; i=pre[edge[i^].to])
  57. if(Min>edge[i].cap-edge[i].flow)
  58. Min=edge[i].cap-edge[i].flow;
  59. for(int i=pre[u]; i!=-; i=pre[edge[i^].to])
  60. {
  61. edge[i].flow+=Min;
  62. edge[i^].flow-=Min;
  63. }
  64. u=start;
  65. ans+=Min;
  66. continue;
  67. }
  68. bool flag=false;
  69. int v;
  70. for(int i=cur[u]; i!=-; i=edge[i].next)
  71. {
  72. v=edge[i].to;
  73. if(edge[i].cap-edge[i].flow && dep[v]+==dep[u])
  74. {
  75. flag=true;
  76. cur[u]=pre[v]=i;
  77. break;
  78. }
  79. }
  80. if(flag)
  81. {
  82. u=v;
  83. continue;
  84. }
  85. int Min=N;
  86. for(int i=head[u]; i!=-; i=edge[i].next)
  87. if(edge[i].cap-edge[i].flow && dep[edge[i].to]<Min)
  88. {
  89. Min=dep[edge[i].to];
  90. cur[u]=i;
  91. }
  92. gap[dep[u]]--;
  93. if(!gap[dep[u]])return ans;
  94. dep[u]=Min+;
  95. gap[dep[u]]++;
  96. if(u!=start) u=edge[pre[u]^].to;
  97. }
  98. return ans;
  99. }
  100.  
  101. bool vit[MAXN],sing[MAXN];
  102.  
  103. int n,m;
  104.  
  105. int dfs(int u,int p)
  106. {
  107. if(vit[u])return ;
  108. vit[u]=;
  109. for(int &i=head[u]; i!=-; i=edge[i].next)
  110. {
  111. int v=edge[i].to;
  112. if(v!=p && edge[i].cap-edge[i].flow>)
  113. if(dfs(v,u)) return ;
  114. }
  115. vit[u]=;
  116. return ;
  117. }
  118.  
  119. int main()
  120. {
  121. int T;
  122. scanf("%d",&T);
  123. for(int t=; t<=T; t++)
  124. {
  125. init();
  126. scanf("%d%d",&n,&m);
  127. int sum1=,sum2=;
  128. int x;
  129. for(int i=; i<=n; i++)
  130. {
  131. scanf("%d",&x);
  132. sum1+=x;
  133. Addedge(,i,x);
  134. }
  135. for(int i=; i<=m; i++)
  136. {
  137. scanf("%d",&x);
  138. sum2+=x;
  139. Addedge(i+n,n+m+,x);
  140. }
  141. if(sum1!=sum2)
  142. {
  143. printf("Case #%d: So naive!\n",t);
  144. continue;
  145. }
  146.  
  147. for(int i=; i<=n; i++)
  148. for(int j=; j<=m; j++)
  149. Addedge(i,j+n,);
  150.  
  151. int ans=sap(,n+m+,n+m+);
  152.  
  153. if(ans==sum1 && ans==sum2)
  154. {
  155. int flag=;
  156. memset(vit,,sizeof(vit));
  157. for(int i=; i<=n; i++)
  158. {
  159. memset(vit,,sizeof(vit));
  160. if(dfs(i,-))
  161. {
  162. flag=;
  163. break;
  164. }
  165. }
  166. if(flag) printf("Case #%d: So young!\n",t);
  167. else printf("Case #%d: So simple!\n",t);
  168. }
  169. else printf("Case #%d: So naive!\n",t);
  170. }
  171. return ;
  172. }

hdu4975 A simple Gaussian elimination problem.(最大流+判环)的更多相关文章

  1. hdu 4975 A simple Gaussian elimination problem 最大流+找环

    原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=4975 这是一道很裸的最大流,将每个点(i,j)看作是从Ri向Cj的一条容量为9的边,从源点除法连接每个 ...

  2. hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)

    这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...

  3. A simple Gaussian elimination problem.(hdu4975)网络流+最大流

    A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...

  4. HDOJ 4975 A simple Gaussian elimination problem.

    和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...

  5. HDU 4975 A simple Gaussian elimination problem.

    A simple Gaussian elimination problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be ...

  6. hdu - 4975 - A simple Gaussian elimination problem.(最大流量)

    意甲冠军:要在N好M行和列以及列的数字矩阵和,每个元件的尺寸不超过9,询问是否有这样的矩阵,是独一无二的N(1 ≤ N ≤ 500) , M(1 ≤ M ≤ 500). 主题链接:http://acm ...

  7. hdu 4975 A simple Gaussian elimination problem.(网络流,推断矩阵是否存在)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One ...

  8. A simple Gaussian elimination problem.

    hdu4975:http://acm.hdu.edu.cn/showproblem.php?pid=4975 题意:给你一个n*m的矩阵,矩阵中的元素都是0--9,现在给你这个矩阵的每一行和每一列的和 ...

  9. hdu4888 Redraw Beautiful Drawings 最大流+判环

    hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/6553 ...

随机推荐

  1. 搭建nexus私服,无法下载相关jar包,报错Repository proxy-mode is BLOCKED_AUTO

    在搭建nexus私服的时候,之前没直接用来下载maven的相关插件jar包,一直可以使用, 结果今天要编译hadoop的时候,在linux上新用maven就报错了,无法下载maven的相关插件(如下) ...

  2. 2017CodeM初赛A场

    A.最长树链(loj6159) 分析: 对于每个质因数,取出所有是它倍数的点组成一个树,然后找最长路径 每个数操作次数是其质因数的个数 所以总的复杂度不超过O(nlogA) B.二分图染色(loj61 ...

  3. loj6157 A^B Problem (并查集)

    题目: https://loj.ac/problem/6157 分析: 这种树上异或,一般是采用分位考虑,但是这题即使分位,也会发现非常不好处理 这里考虑维护一个点到其根的路径的异或值 用并查集去检测 ...

  4. 石家庄地铁查询PSP0级

    一.需求   :地铁(石家庄地铁)线路查询 二.       学生:洪鼎淇 合作对象:宋子健 时间记录日志: 日期 开始时间 结束时间 中断时间 净时间 活动 2019/3/30 10:00 14:0 ...

  5. 【.Net 学习系列】-- EF Core实践(Code First)

    一.开发环境: vs2015, .Net Framework 4.6.1 二.解决方案: 新建一个控制台应用程序 添加引用:Microsoft.EntityFrameworkCore.SqlServe ...

  6. HUNT:一款可提升漏洞扫描能力的BurpSuite漏洞扫描插件

    今天给大家介绍的是一款BurpSuite插件,这款插件名叫HUNT.它不仅可以识别指定漏洞类型的常见攻击参数,而且还可以在BurpSuite中组织测试方法. HUNT Scanner(hunt_sca ...

  7. Centos5设置静态IP地址

    1.设置静态IP地址,修改/etc/sysconfig/network-scripts/ifcfg-eth0的内容: DEVICE=eth0 #网卡对应的设备别名 BOOTPROTO=static # ...

  8. ASP.net MVC+ViewData VS ViewBag

         在使用MVC框架的过程中,往界面传值,我们使用的ViewData.如ITOO部分代码图解:      当然除了ViewData,我们还能够使用同卵兄弟(ViewBag)来完毕相同的功能,详情 ...

  9. Lucene中TokenStream,Tokenizer,TokenFilter,TokenStreamComponents与Analyzer

    TokenStream extends AttributeSource implements Closeable: incrementToken,end,reset,close Tokenizer直接 ...

  10. asp.net mvc的权限管理设计

    现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理.   1 后台管理效果 (1)角色管理 (2)权限管理   2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...