2229: [Zjoi2011]最小割(最小割树)
Description
小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。 对于带权图来说,将所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在关于s,t的割中容量最小的割” 现给定一张无向图,小白有若干个形如“图中有多少对点它们的最小割的容量不超过x呢”的疑问,小蓝虽然很想回答这些问题,但小蓝最近忙着挖木块,于是作为仍然是小蓝的好友,你又有任务了。
Input
输入文件第一行有且只有一个正整数T,表示测试数据的组数。 对于每组测试数据, 第一行包含两个整数n,m,表示图的点数和边数。 下面m行,每行3个正整数u,v,c(1<=u,v<=n,0<=c<=106),表示有一条权为c的无向边(u,v) 接下来一行,包含一个整数q,表示询问的个数 下面q行,每行一个整数x,其含义同题目描述。
Output
对于每组测试数据,输出应包括q行,第i行表示第i个问题的答案。对于点对(p,q)和(q,p),只统计一次(见样例)。
两组测试数据之间用空行隔开。
Sample Input
5 0
1
0
Sample Output
【数据范围】
对于100%的数据 T<=10,n<=150,m<=3000,q<=30,x在32位有符号整数类型范围内。
图中两个点之间可能有多条边
- #include<queue>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- const int oo=0x3f3f3f3f;
- struct pnt{
- int hd;
- int lyr;
- int now;
- bool vis;
- }p[];
- struct ent{
- int twd;
- int lst;
- int vls;
- int his;
- }e[];
- int cnt;
- int n,m;
- int s,t;
- int app[];
- int tmp[];
- int ans[][];
- std::queue<int>Q;
- void ade(int f,int t,int v)
- {
- cnt++;
- e[cnt].twd=t;
- e[cnt].vls=v;
- e[cnt].his=v;
- e[cnt].lst=p[f].hd;
- p[f].hd=cnt;
- return ;
- }
- bool Bfs(void)
- {
- while(!Q.empty())Q.pop();
- for(int i=;i<=n;i++)
- p[i].lyr=;
- p[s].lyr=;
- Q.push(s);
- while(!Q.empty())
- {
- int x=Q.front();
- Q.pop();
- for(int i=p[x].hd;i;i=e[i].lst)
- {
- int to=e[i].twd;
- if(p[to].lyr==&&e[i].vls>)
- {
- p[to].lyr=p[x].lyr+;
- if(to==t)
- return true;
- Q.push(to);
- }
- }
- }
- return false;
- }
- int Dfs(int x,int fll)
- {
- if(x==t)
- return fll;
- for(int& i=p[x].now;i;i=e[i].lst)
- {
- int to=e[i].twd;
- if(p[to].lyr==p[x].lyr+&&e[i].vls>)
- {
- int ans=Dfs(to,std::min(fll,e[i].vls));
- if(ans>)
- {
- e[i].vls-=ans;
- e[((i-)^)+].vls+=ans;
- return ans;
- }
- }
- }
- return ;
- }
- int Dinic()
- {
- int ans=;
- while(Bfs())
- {
- for(int i=;i<=n;i++)
- p[i].now=p[i].hd;
- int dlt;
- while(dlt=Dfs(s,oo))
- ans+=dlt;
- }
- return ans;
- }
- void dfs(int x)
- {
- if(p[x].vis)
- return ;
- p[x].vis=true;
- for(int i=p[x].hd;i;i=e[i].lst)
- {
- int to=e[i].twd;
- if(e[i].vls>)
- dfs(to);
- }
- return ;
- }
- void Build(int l,int r)
- {
- if(l==r)
- return ;
- s=app[l],t=app[r];
- for(int i=;i<=cnt;i+=)
- {
- e[i].vls=e[i].his;
- e[i+].vls=e[i+].his;
- e[i+].vls=e[i+].his;
- e[i+].vls=e[i+].his;
- }
- int tmf=Dinic();
- for(int i=;i<=n;i++)
- p[i].vis=false;
- dfs(s);
- for(int i=;i<=n;i++)
- if(p[i].vis)
- for(int j=;j<=n;j++)
- if(!p[j].vis)
- ans[i][j]=ans[j][i]=std::min(ans[i][j],tmf);
- int i=l-,j=r+;
- for(int k=l;k<=r;k++)
- if(p[app[k]].vis)
- tmp[++i]=app[k];
- else
- tmp[--j]=app[k];
- for(int k=l;k<=r;k++)
- app[k]=tmp[k];
- Build(l,i);
- Build(j,r);
- return ;
- }
- int main()
- {
- // freopen("a.in","r",stdin);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&m);
- cnt=;
- for(int i=;i<=n;i++)
- app[i]=i,
- p[i].hd=;
- memset(ans,0x3f,sizeof(ans));
- for(int i=;i<=m;i++)
- {
- int a,b,c;
- scanf("%d%d%d",&a,&b,&c);
- ade(a,b,c);
- ade(b,a,c);
- }
- Build(,n);
- int q;
- scanf("%d",&q);
- while(q--)
- {
- int x;
- scanf("%d",&x);
- int ansl=;
- for(int i=;i<n;i++)
- for(int j=i+;j<=n;j++)
- if(ans[i][j]<=x)
- ansl++;
- printf("%d\n",ansl);
- }
- puts("");
- }
- return ;
- }
2229: [Zjoi2011]最小割(最小割树)的更多相关文章
- bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...
- 【BZOJ-2229】最小割 最小割树(最大流+分治)
2229: [Zjoi2011]最小割 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1565 Solved: 560[Submit][Status ...
- scu - 3254 - Rain and Fgj(最小点权割)
题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- HDU 1394 Minimum Inversion Number(最小逆序数 线段树)
Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)
思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...
- BZOJ.2229.[ZJOI2011]最小割(最小割树)
题目链接 题意:给定一张无向图,求任意两点之间的最小割. 在所有点中任选两个点作为源点\(S\).汇点\(T\),求它们之间的最小割\(ans\),并把原图分成两个点集\(S',T'\),用\(ans ...
随机推荐
- Linux VNC Viewer客户端
1.realvnc-vnc-viewer 这个我感觉应该是做的做好用的VNC Viewer客户端了,毕竟是商业软件,但是VNC Viewer客户端是免费的.使用前 需要到官网下载对应发行版的软件包进行 ...
- Database Exception – yii\db\Exception
在使用Yii2框架时遇到数据库无法访问的问题: 这个是由于 通常我们在参考 教程在 MAC OS LINUX下安装 MYSQL 时,默认将PHP.ini 中的以下三项留空导致的Yii2所需的PDO组建 ...
- 关于common.js里面的module.exports与es6的export default的思考总结
背景 公司项目需要裁切功能,基于第三方图片裁切组件vue-cropper(0.4.0版本),封装了图片裁切组件(picture-cut)(放在公司内部组件库,仅限于公司内部使用) 在vue-cropp ...
- 使用jemdoc制作个人主页
jemdoc官网说明: http://jemdoc.jaboc.net/index.html 作者的个人主页:https://jemnz.com/ 将下载的jemdoc.py文件和需要转化的xxx.j ...
- caioj 1073 动态规划入门(三维一边推:最长公共子序列加强版(三串LCS))
三维的与二维大同小异,看代码. #include<cstdio> #include<cstring> #include<algorithm> #define REP ...
- Unity 如何将apk放到Android系统的system里
有时我们需要用unity开发一款Android的系统软件,很坑,步骤如下: 1.用unity打包出来,签名. 2.用解压工具打开签过名的apk. 3.将lib里面的.so文件复制出来. 4.adb r ...
- ARM官方《CMSIS-RTOS教程》之线程Threads
创建线程Creating Threads 一旦RTOS开始运行,就会有很多系统调用来管理和控制活跃的线程.默认情况下,main()函数自动被创建为第一个可运行的线程.在第一个例子里我们使用main() ...
- 【v2.x OGE教程 17】事务处理
游戏代码中常常有些逻辑须要处理.因此OGE引擎加入了一个IUpdateHandler的类. IUpdateHandler类是OGE引擎中使用频率很之高的组件之中的一个,其本身是一个接口.内部有onUp ...
- BZOJ 3629 约数和定理+搜索
呃呃 看到了这道题 没有任何思路-- 百度了一发题解 说要用约数和定理 就查了一发 http://baike.so.com/doc/7207502-7432191.html (不会的可以先学习一下) ...
- Android App中使用Gallery制作幻灯片播放效果
http://www.jb51.net/article/83313.htm 我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果 ...