【BZOJ2561】最小生成树

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。

题解:回忆Kruskal的过程,如果只用边权<L的点,u和v就能连通,那么(u,v)一定不再最小生成树上。所以,我们只保留边权<L的点,跑u->v的最小割即可。

最大生成树同理。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <queue>
  5. #include <algorithm>
  6. using namespace std;
  7. int S,T,L,n,m,cnt,ans;
  8.  
  9. int head[20010],next[800010],val[800010],to[800010],d[20010],pa[200010],pb[200010],len[200010];
  10. queue<int> q;
  11.  
  12. int rd()
  13. {
  14. int ret=0,f=1; char gc=getchar();
  15. while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
  16. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  17. return ret*f;
  18. }
  19. int dfs(int x,int mf)
  20. {
  21. if(x==T) return mf;
  22. int i,k,temp=mf;
  23. for(i=head[x];i!=-1;i=next[i])
  24. {
  25. if(d[to[i]]==d[x]+1&&val[i])
  26. {
  27. k=dfs(to[i],min(temp,val[i]));
  28. if(!k) d[to[i]]=0;
  29. val[i]-=k,val[i^1]+=k,temp-=k;
  30. if(!temp) break;
  31. }
  32. }
  33. return mf-temp;
  34. }
  35. int bfs()
  36. {
  37. memset(d,0,sizeof(d));
  38. while(!q.empty()) q.pop();
  39. int i,u;
  40. d[S]=1,q.push(S);
  41. while(!q.empty())
  42. {
  43. u=q.front(),q.pop();
  44. for(i=head[u];i!=-1;i=next[i])
  45. {
  46. if(!d[to[i]]&&val[i])
  47. {
  48. d[to[i]]=d[u]+1;
  49. if(to[i]==T) return 1;
  50. q.push(to[i]);
  51. }
  52. }
  53. }
  54. return 0;
  55. }
  56. void add(int a,int b,int c)
  57. {
  58. to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
  59. to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
  60. }
  61. int main()
  62. {
  63. n=rd(),m=rd();
  64. int i;
  65. for(i=1;i<=m;i++) pa[i]=rd(),pb[i]=rd(),len[i]=rd();
  66. S=rd(),T=rd(),L=rd();
  67. memset(head,-1,sizeof(head)),cnt=0;
  68. for(i=1;i<=m;i++) if(len[i]<L) add(pa[i],pb[i],1),add(pb[i],pa[i],1);
  69. while(bfs()) ans+=dfs(S,1<<30);
  70. memset(head,-1,sizeof(head)),cnt=0;
  71. for(i=1;i<=m;i++) if(len[i]>L) add(pa[i],pb[i],1),add(pb[i],pa[i],1);
  72. while(bfs()) ans+=dfs(S,1<<30);
  73. printf("%d",ans);
  74. return 0;
  75. }

【BZOJ2561】最小生成树 最小割的更多相关文章

  1. BZOJ2561最小生成树——最小割

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

  2. 【BZOJ-2521】最小生成树 最小割

    2521: [Shoi2010]最小生成树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 415  Solved: 242[Submit][Statu ...

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

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

  4. BZOJ2521:[SHOI2010]最小生成树(最小割)

    Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...

  5. BZOJ2521[Shoi2010]最小生成树——最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  6. 【BZOJ2521】[Shoi2010]最小生成树 最小割

    [BZOJ2521][Shoi2010]最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算 ...

  7. BZOJ2521 最小生成树 最小割

    5.26 T2:最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法 ...

  8. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)

    题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...

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

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

随机推荐

  1. Road(bzoj 2750)

    Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ...

  2. C++基类与派生类的转换

    具体表现在以下几个方面: 派生类对象可以向基类对象赋值. 可以用子类(即公用派生类)对象对其基类对象赋值.如    A a1; //定义基类A对象a1    B b1; //定义类A的公用派生类B的对 ...

  3. 【BZOJ入门3189】 猜数字(数学,搜索)

    Description 味味最近在玩猜数字的游戏,现在她也希望你来玩一下这个游戏.猜数字游戏的规则是这样的,告诉你一个正整数 n(2<=n<=11),然后味味心中会想一个 n 个数字组成的 ...

  4. 【CF712D】Memory and Scores(概率,DP,前缀和)

    题意:AB两人玩一个游戏,两人玩t轮 每人每次随机且等概率从[-k,k]中取一个数字加到总得分中 得分高者赢 已知A B初始分别有a b分,问A取得胜利的概率是多少 (1 ≤ a, b ≤ 100,  ...

  5. 应用css3制作loading效果

    参考秒味课堂 代码发出来备忘 html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  6. 为什么linux下多线程程序如此消耗虚拟内存【转】

    转自:http://blog.csdn.net/chen19870707/article/details/43202679 权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 探 ...

  7. grep用法详解:grep与正则表达式【转】

    转自:http://blog.csdn.net/hellochenlian/article/details/34088179 grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配 ...

  8. 制作不随浏览器滚动的DIV-带关闭按钮

    制作不随浏览器滚动的DIV 效果见 http://bbs.csdn.net/topics/90292438  的滚动效果. $(function(){ //获取要定位元素距离浏览器顶部的距离 var ...

  9. FMDB使用SQLite事务Save Point

    FMDB使用SQLite事务Save Point   在SQLite中,事务提供了批量处理,批量撤销的功能.当批量操作中有一步无法完成操作,就会把执行过的语句都撤销,恢复到撤销前的状态.但是由于SQL ...

  10. HTTP基础认证Basic Authentication

    HTTP基础认证Basic Authentication Basic Authentication是一种HTTP访问控制方式,用于限制对网站资源的访问.这种方式不需要Cookie和Session,只需 ...