思路一下就上来了,叶子向汇点连边,inf保证不会成为割,跑根到汇点最小割就可以。注意无向树双向建边。基础题,分分钟1A:

  1. #include<iostream>
  2. #include<queue>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<set>
  6. #include<vector>
  7. using namespace std;
  8. const int inf=0x3f3f3f3f;
  9. const int maxv=1005,maxe=10000;
  10. int nume=0;int head[maxv];int e[maxe][3];
  11. void inline adde(int i,int j,int c)
  12. {
  13. e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
  14. e[nume++][2]=c;
  15. e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
  16. e[nume++][2]=0;
  17. }
  18. int ss,tt,n,m;
  19. int vis[maxv];int lev[maxv];
  20. bool bfs()
  21. {
  22. for(int i=0;i<maxv;i++)
  23. vis[i]=lev[i]=0;
  24. queue<int>q;
  25. q.push(ss);
  26. vis[ss]=1;
  27. while(!q.empty())
  28. {
  29. int cur=q.front();
  30. q.pop();
  31. for(int i=head[cur];i!=-1;i=e[i][1])
  32. {
  33. int v=e[i][0];
  34. if(!vis[v]&&e[i][2]>0)
  35. {
  36. lev[v]=lev[cur]+1;
  37. vis[v]=1;
  38. q.push(v);
  39. }
  40. }
  41. }
  42. return vis[tt];
  43. }
  44. int dfs(int u,int minf)
  45. {
  46. if(u==tt||minf==0)return minf;
  47. int sumf=0,f;
  48. for(int i=head[u];i!=-1&&minf;i=e[i][1])
  49. {
  50. int v=e[i][0];
  51. if(lev[v]==lev[u]+1&&e[i][2]>0)
  52. {
  53. f=dfs(v,minf<e[i][2]?minf:e[i][2]);
  54. e[i][2]-=f;e[i^1][2]+=f;
  55. sumf+=f;minf-=f;
  56. }
  57. }
  58. if(!sumf) lev[u]=-1;
  59. return sumf;
  60. }
  61. int dinic()
  62. {
  63. int sum=0;
  64. while(bfs())sum+=dfs(ss,inf);
  65. return sum;
  66. };
  67. int ind[maxv];
  68. void read_build()
  69. {
  70. int aa,bb,cc;
  71. for(int i=0;i<n-1;i++)
  72. {
  73. scanf("%d%d%d",&aa,&bb,&cc);
  74. adde(aa,bb,cc);
  75. adde(bb,aa,cc);
  76. ind[aa]++;ind[bb]++;
  77. }
  78. for(int i=1;i<=n;i++)
  79. if(i!=m&&ind[i]==1)
  80. {
  81. adde(i,tt,inf);
  82. }
  83.  
  84. /* for(int i=0;i<=tt;i++)
  85. for(int j=head[i];j!=-1;j=e[j][1])
  86. {
  87. if(j%2==0)
  88. printf("%d->%d:%d\n",i,e[j][0],e[j][2]);
  89. }*/
  90. }
  91. void init()
  92. {
  93. nume=0;
  94. ss=m;tt=n+1;
  95. for(int i=0;i<=tt;i++)
  96. {
  97. head[i]=-1;ind[i]=0;
  98. }
  99. }
  100. int main()
  101. {
  102. while(~scanf("%d%d",&n,&m)&&(n||m))
  103. {
  104. init();
  105. read_build();
  106. int ans;
  107. ans=dinic();
  108. printf("%d\n",ans);
  109. }
  110. return 0;
  111. }

hdu3452 无向树去掉最小的边集使不论什么叶子与根不连通 / 最小割的更多相关文章

  1. hdu3452 无向树去掉最小的边集使任何叶子与根不连通 / 最小割

    思路一下就上来了,叶子向汇点连边,inf保证不会成为割,跑根到汇点最小割即可.注意无向树双向建边.基础题,分分钟1A: #include<iostream> #include<que ...

  2. SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp

    题意:求一颗无向树的最小点覆盖. 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE. 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推. ...

  3. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  4. HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价

    Information Disturbing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/ ...

  5. 《Effective Java》笔记 使类和成员的可访问性最小化

    类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...

  6. Effective Java 第三版——15. 使类和成员的可访问性最小化

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. LeetCode 453. 最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements) 47

    453. 最小移动次数使数组元素相等 453. Minimum Moves to Equal Array Elements 题目描述 给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移 ...

  8. Java实现 LeetCode 453 最小移动次数使数组元素相等

    453. 最小移动次数使数组元素相等 给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 ...

  9. 求去掉一条边使最小割变小 HAOI2017 新型城市化

    先求最小割,然后对残量网络跑Tarjan.对于所有满流的边,若其两端点不在同一个SCC中,则这条边是满足条件的. 证明见 来源:HAOI2017 新型城市化

随机推荐

  1. csdn发博文验证码缺陷

    csdn验证码的长处: 一,差点儿没有浪费人脑人力,却要花去机器人非常多cpu csdn发博文验证码却有非常大缺陷: 一.验证码的内容终于结果是简单的数字,能够穷举尽的,也就是说不怕被封号的话全然能够 ...

  2. hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题

    题意:给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内. 只要用筛选法打出素数表,枚举查询下就行了. 我用set储存素数,然后遍历set里面的元素,查询+x后是否还 ...

  3. thinkphp模版调用函数方法

    原文:thinkphp模版调用函数方法 {变量|函数1|函数2|函数3=参数1,参数2,参数3,###} ###为第4个参数,代表变量替换为第4个参数 举例: {$username|substr=0, ...

  4. Socket编程之聊天程序 - 模拟Fins/ModBus协议通信过程

    设备控制软件编程涉及到的基本通信方式主要有TCP/IP与串口,用到的数据通信协议有Fins与ModBus. 更高级别的通信如.net中的Remoting与WCF在进行C/S架构软件开发时会采用. 本篇 ...

  5. C++智能指针--weak_ptr

    weak_ptr是对对象的一种弱引用,它不会添加对象的引用计数.weak_ptr和shared_ptr之间能够相互转换.shared_ptr能够直接赋值给week_ptr,week_ptr可通过调用l ...

  6. 基于Linux根据僵尸网络病毒平台《比尔盖茨》

    感觉分析的非常好,所以决定翻译出来,希望和大家多多交流O(∩_∩)O~ 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 keyword:病毒 ...

  7. Latin1的所有字符编码

    ISO-8859-1 (ISO Latin 1) Character Encoding Contents The characters at a glance Character codes and ...

  8. Dvtm -- 平铺式终端

    Dvtm -- 平铺式终端_Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休! Dvtm -- 平铺式终端 关注我们: 如果你使用过 Dwn 或 Awesome 这种平铺式窗口管理器,一定 ...

  9. Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)

    结论:  数组,无论是否声明为transient,都是可以序列化.反序列化的. 测试情况如下: 1.两种类型的数组:int .String: 2 声明为transient  或者不做任何修饰:. 3. ...

  10. jenkins 通过批处理自动构建 非标准项目

    之前介绍了java和vs2010的项目构建,这些都是比较常见的,所以都用专门的工具.但但难免会遇到一些不常见的项目,下面介绍通过批处理进行构建,并用jenkins调用.我们这里使用plc语言,没有标准 ...