【BZOJ4519】[Cqoi2016]不同的最小割

Description

学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。对于带权图来说,将所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在关于s,t的割中容量最小的割。而对冲刺NOI竞赛的选手而言,求带权图中两点的最小割已经不是什么难事了。我们可以把视野放宽,考虑有N个点的无向连通图中所有点对的最小割的容量,共能得到N(N−1)2个数值。
这些数值中互不相同的有多少个呢?这似乎是个有趣的问题。

Input

输入文件第一行包含两个数N,M,表示点数和边数。接下来M行,每行三个数u,v,w,
表示点u和点v(从1开始标号)之间有条边权值是w。
1<=N<=850 1<=M<=8500 1<=W<=100000

Output

输出文件第一行为一个整数,表示个数。

Sample Input

4 4
1 2 3
1 3 6
2 4 5
3 4 4

Sample Output

3

题解:同BZOJ2229

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <queue>
  5. #include <algorithm>
  6. using namespace std;
  7. int n,m,cnt,S,T,ans;
  8. int to[20000],next[20000],val[20000],head[1000],d[1000];
  9. int map[1000][1000],p[1000],pp[1000],s[1000000];
  10. queue<int> q;
  11. void add(int a,int b,int c)
  12. {
  13. to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
  14. to[cnt]=a,val[cnt]=c,next[cnt]=head[b],head[b]=cnt++;
  15. }
  16. int dfs(int x,int mf)
  17. {
  18. if(x==T) return mf;
  19. int k,temp=mf,i;
  20. for(i=head[x];i!=-1;i=next[i])
  21. {
  22. if(d[to[i]]==d[x]+1&&val[i])
  23. {
  24. k=dfs(to[i],min(temp,val[i]));
  25. if(!k) d[to[i]]=0;
  26. val[i]-=k,val[i^1]+=k,temp-=k;
  27. if(!temp) break;
  28. }
  29. }
  30. return mf-temp;
  31. }
  32. int bfs()
  33. {
  34. while(!q.empty()) q.pop();
  35. memset(d,0,sizeof(d));
  36. d[S]=1,q.push(S);
  37. int i,u;
  38. while(!q.empty())
  39. {
  40. u=q.front(),q.pop();
  41. for(i=head[u];i!=-1;i=next[i])
  42. {
  43. if(!d[to[i]]&&val[i])
  44. {
  45. d[to[i]]=d[u]+1;
  46. if(to[i]==T) return 1;
  47. q.push(to[i]);
  48. }
  49. }
  50. }
  51. return 0;
  52. }
  53. void solve(int l,int r)
  54. {
  55. if(l==r) return ;
  56. S=p[l],T=p[r];
  57. int i,j,h1=l,h2=r,mf=0;
  58. for(i=0;i<cnt;i+=2) val[i]=val[i^1]=val[i]+val[i^1]>>1;
  59. while(bfs()) mf+=dfs(S,1<<30);
  60. for(i=1;i<=n;i++) if(d[i])
  61. for(j=1;j<=n;j++) if(!d[j])
  62. map[i][j]=map[j][i]=min(map[i][j],mf);
  63. for(i=l;i<=r;i++)
  64. {
  65. if(d[p[i]]) pp[h1++]=p[i];
  66. else pp[h2--]=p[i];
  67. }
  68. for(i=l;i<=r;i++) p[i]=pp[i];
  69. solve(l,h2),solve(h1,r);
  70. }
  71. int rd()
  72. {
  73. int ret=0,f=1; char gc=getchar();
  74. while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
  75. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  76. return ret*f;
  77. }
  78. int main()
  79. {
  80. n=rd(),m=rd();
  81. int i,j,a,b,c,pre;
  82. memset(head,-1,sizeof(head));
  83. memset(map,0x3f,sizeof(map));
  84. for(i=1;i<=m;i++) a=rd(),b=rd(),c=rd(),add(a,b,c);
  85. for(i=1;i<=n;i++) p[i]=i;
  86. solve(1,n);
  87. for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) s[++s[0]]=map[i][j];
  88. sort(s+1,s+s[0]+1);
  89. for(pre=-1,i=1;i<=s[0];i++) if(s[i]>pre) pre=s[i],ans++;
  90. printf("%d",ans);
  91. return 0;
  92. }

【BZOJ4519】[Cqoi2016]不同的最小割 最小割树的更多相关文章

  1. [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树

    不同的最小割 bzoj-4519 Cqoi-2016 题目大意:题目链接. 注释:略. 想法: 我们发现这和最小割那题比较像. 我们依然通过那个题说的办法一样,构建最小割树即可. 接下来就是随便怎么处 ...

  2. scu - 3254 - Rain and Fgj(最小点权割)

    题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...

  3. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  4. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  5. bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)

    2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...

  6. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  7. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  8. 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)

    思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...

  9. BZOJ4519 CQOI2016不同的最小割(最小割+分治)

    最小割树:新建一个图,包含原图的所有点,初始没有边.任取两点跑最小割,给两点连上权值为最小割的边,之后对于两个割集分别做同样的操作.最后会形成一棵树,树上两点间路径的最小值即为两点最小割.证明一点都不 ...

随机推荐

  1. strcpy_s 函数的用法

    strcpy_s和strcpy()函数的功能几乎是一样的. strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串.在程序运行时,这将导 ...

  2. 四、Ubuntu 一些常用命令

    1.锁定root用户 :sudo passwd -l root 2.解锁root用户 :sudo passwd -u root 3.切换身份:su root  或者  su 其他用户名,然后输入密码, ...

  3. Codeforces Gym101063 C.Sleep Buddies (2016 USP-ICMC)

    C.Sleep Buddies It is nighttime in the Earth Colony on Mars and everyone is getting ready to sleep. ...

  4. 在typescript中import第三方类库clipboard报错

    一.问题 在实际开发项目中就遇到了这样的问题,需要在Vue+Typescript项目中添加复制文本的功能,就找了clipboard插件,先是新建了一个新的项目用来实验看看是否好用,都写好了以后发给别人 ...

  5. Java死锁及解决

    Java线程死锁如何避免这一悲剧  Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键.不幸的是,使用上锁会带来其他问题.让我们来看一些常见问题以及相应的解决方法: Jav ...

  6. CodeForces - 16E Fish

    Discription n fish, numbered from 1 to n, live in a lake. Every day right one pair of fish meet, and ...

  7. spring配置文件中配置sessionFactory失败

    配置失败主要原因有两个: <bean id="studentDaoImp" class="com.gxwuz.maven.dao.StudentDaoImp&quo ...

  8. jquery_final

    第一章 jquery入门 1,jquery的引入 <script type="text/javascript" src="js/jquery-3.3.1.min.j ...

  9. js判断是否是PC,IOS,Android客户端

    写在前面 在项目中使用html5,需要针对不同的客户端浏览器有不一样的处理方式,这就需要对请求中的useragent进行分析,并进行处理. 一个例子 <%@ Page Language=&quo ...

  10. 【jsp】jsp访问到之后报错如下:Uncaught SyntaxError: Unexpected token <

    jsp访问到之后报错如下: Uncaught SyntaxError: Unexpected token < 问题出在哪里: 发现把这个注销掉,就不会出现这个问题了,那script引用js文件哪 ...