网络流/最小割


  对于所有小于L的边求一个割使得U,V不连通,这样就可以保证L可能在最小生成树里。

  最大生成树同理。

  答案累加一下即可。(Orz Hzwer

(我一开始怎么会sb地去想到一起求呢……)

  1. /**************************************************************
  2. Problem: 2561
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:884 ms
  7. Memory:15340 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 2561
  11. #include<cstdio>
  12. #include<cstring>
  13. #include<algorithm>
  14. #define rep(i,n) for(int i=0;i<n;++i)
  15. #define F(i,j,n) for(int i=j;i<=n;++i)
  16. #define D(i,j,n) for(int i=j;i>=n;--i)
  17. using namespace std;
  18. inline int getint(){
  19. int v=,sign=; char ch=getchar();
  20. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  21. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  22. return v*sign;
  23. }
  24. const int N=,M=,INF=~0u>>;
  25. typedef long long LL;
  26. /******************tamplate*********************/
  27. int n,m,l,ans,x[],y[],v[];
  28. struct edge{int to,v;};
  29. struct Net{
  30. edge E[M];
  31. int head[N],next[M],cnt;
  32. void ins(int x,int y,int v){
  33. E[++cnt]=(edge){y,v};
  34. next[cnt]=head[x]; head[x]=cnt;
  35. }
  36. void add(int x,int y,int v){
  37. ins(x,y,v); ins(y,x,v);
  38. }
  39. int s,t,cur[N],d[N],Q[N];
  40. void init(){
  41. n=getint(); m=getint();cnt=;
  42. memset(head,,sizeof head);
  43. F(i,,m){
  44. x[i]=getint(); y[i]=getint(); v[i]=getint();
  45. }
  46. s=getint(); t=getint(); l=getint(); ans=;
  47.  
  48. F(i,,m) if (v[i]<l) add(x[i],y[i],);
  49. Dinic();
  50. cnt=; memset(head,,sizeof (head));
  51. F(i,,m) if (v[i]>l) add(x[i],y[i],);
  52. Dinic();
  53. printf("%d\n",ans);
  54. }
  55. bool mklevel(){
  56. memset(d,-,sizeof d);
  57. d[s]=;
  58. int l=,r=-;
  59. Q[++r]=s;
  60. while(l<=r){
  61. int x=Q[l++];
  62. for(int i=head[x];i;i=next[i])
  63. if (d[E[i].to]==- && E[i].v){
  64. d[E[i].to]=d[x]+;
  65. Q[++r]=E[i].to;
  66. }
  67. }
  68. return d[t]!=-;
  69. }
  70. int dfs(int x,int a){
  71. if (x==t) return a;
  72. int flow=;
  73. for(int &i=cur[x];i && flow<a;i=next[i])
  74. if (E[i].v && d[E[i].to]==d[x]+){
  75. int f=dfs(E[i].to,min(a-flow,E[i].v));
  76. E[i].v-=f;
  77. E[i^].v+=f;
  78. flow+=f;
  79. }
  80. if (!flow) d[x]=-;
  81. return flow;
  82. }
  83. void Dinic(){
  84. while(mklevel()){
  85. F(i,,n) cur[i]=head[i];
  86. ans+=dfs(s,INF);
  87. }
  88. }
  89. }G1;
  90.  
  91. int main(){
  92. #ifndef ONLINE_JUDGE
  93. freopen("2561.in","r",stdin);
  94. freopen("2561.out","w",stdout);
  95. #endif
  96. G1.init();
  97. return ;
  98. }

2561: 最小生成树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 873  Solved: 435
[Submit][Status][Discuss]

Description

 
给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L
(u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树
上?

 

Input

 
  第一行包含用空格隔开的两个整数,分别为N和M;
  接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v)。
  最后一行包含用空格隔开的三个整数,分别为u,v,和 L;
  数据保证图中没有自环。

 

Output

 输出一行一个整数表示最少需要删掉的边的数量。

Sample Input

3 2
3 2 1
1 2 3
1 2 2

Sample Output

1

HINT

对于20%的数据满足N ≤ 10,M ≤ 20,L ≤ 20;

  对于50%的数据满足N ≤ 300,M ≤ 3000,L ≤ 200;

  对于100%的数据满足N ≤ 20000,M ≤ 200000,L ≤ 20000。

Source

[Submit][Status][Discuss]

【BZOJ】【2561】最小生成树的更多相关文章

  1. BZOJ 2561: 最小生成树(最小割)

    U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...

  2. BZOJ 2561 最小生成树 | 网络流 最小割

    链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...

  3. BZOJ 2561 最小生成树(最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2561 题意:给定一个边带正权的连通无向图G= (V,E),其中N=|V|,M=|E|,N ...

  4. bzoj 2561: 最小生成树【最小割】

    看错题了以为多组询问吓得不行-- 其实还挺好想的,就是数据范围一点都不网络流.把U作为s,V作为t,以最小生成树为例,(U,V,L)要在最小生成树上,就要求所有边权比L小的边不能连通(U,V)所在的联 ...

  5. bzoj 2561: 最小生成树

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  6. BZOJ 2561: 最小生成树【最小割/最大流】

    Description 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v), ...

  7. 【BZOJ】2561: 最小生成树【网络流】【最小割】

    2561: 最小生成树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2685  Solved: 1253[Submit][Status][Discu ...

  8. BZOJ 1016 最小生成树计数

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

  9. BZOJ 2521 最小生成树(最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2521 题意:每次能增加一条边的权值1,求最小代价让一条边保证在最小生成树里 思路:如果两个点中有环, ...

  10. BZOJ 1016--[JSOI2008]最小生成树计数(kruskal&搜索)

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7429  Solved: 3098[Submit][St ...

随机推荐

  1. Excel VBA 快捷键 代码

    一. 在ThisWorkbook中 Private Sub Workbook_Open() '%对应alt键 宏不能加() Application.OnKey "%q", &quo ...

  2. Swift字典

    字典初始化 基本语法: [key 1: value 1, key 2: value 2, key 3: value 3] var   airports:    Dictionary<String ...

  3. 用实体框架搭建MVC程序框架(全部)

    第一步:1.新建项目 2.新建domain类库 3.新建Data类库 4.为上面的1.2.3添加实体框架nuget包.(可以右键管理nuget包来查找entityframework,当然也可以通过程序 ...

  4. 20141104--SQL连接查询,联合查询

    ---------------------------连接查询-------------------------------- --横向连接查询 --可以将子查询放在from之前,用来替换显示出来的信 ...

  5. 解决IE8打开默认弹出开发者工具的问题

    有一次开发用ie调试后再次打开总是自动弹出ie开发者工具,而且在网页的上一层弹出.点击X关闭后再次打开还是会弹出! 找ie的设置也没有找到关闭的选项. 在网上搜了很多资料才找到解决的办法,在这里分享一 ...

  6. defrag磁盘整理命令

    1: Microsoft 磁盘碎片整理程序 2: 版权所有 (c) 2007 Microsoft Corp. 3: 参数错误. (0x80070057) 4: 描述: 5: 定位并合并本地卷中的碎片文 ...

  7. .NET4.5可以给所有线程设置默认的Culture了

    How to set CurrentCulture for all threads in a domain in .NET 4.5 Before .NET 4.5 if we wanted to se ...

  8. 通过Driver获取数据库连接

    先看一下文件,在当前包下有一个properties配置文件,在根目录下有一个lib文件夹,里面放的是mySql的驱动jar包 Driver :是一个接口,数据库厂商必须提供实现的接口,能从其中获取数据 ...

  9. Bootstrap轮播(carousel)插件中图片变形的终极解决方案——使用jqthumb.js

    在顶求网的首页中我使用了BootStrap的轮播(carousel)插件来展示文章中的图片.我在程序中自动抓取文章的第一张图片作为该轮播控件中要显示的图片,由于文章的图片大小不一,而轮播插件的大小基本 ...

  10. php后台如何避免用户直接进入方法实例

    这篇文章介绍了php后台如何避免用户直接进入方法实例,有需要的朋友可以参考一下 1)创建BaseController控制器继承Controller(后台的一切操作要继承BaseController): ...