bzoj2561】的更多相关文章

考虑kruskal的过程:按边权从小到大考虑,如果这条边的两端点当前不连通则将其加入最小生成树.由此可以发现,某条边可以在最小生成树上的充要条件是其两端点无法通过边权均小于它的边连接. 那么现在我们需要删一些边使两点不连通,显然是最小割.对最小和最大分别做一次即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #in…
[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). 最后一行包含用空格隔开的三个整…
最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树边的情况下覆盖的边的最小值不可以比$L$小. 如此,我们级就可以通过网络流来求了. 对于每一条比$L$小的边,我们连双向边,求当前边$u,v$的最小割即可. 如果是最大生成树的话同理,我们只需要把所有比当前加入的边的权值小的边在网络流中连无向边,然后跑最小割即可. Code: #include <i…
bzoj2561最小生成树 题意: 给定一个连通无向图,假设现在加入一条边权为L的边(u,v),求需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上. 题解: 最小割.如果一个边出现在最小生成树上,那么权值比它小的边一定不能使图联通.因为要求删掉最少,所以当加入这条边后整个图刚好联通.因此可以将这条边的一个端点作为源,另一端点作为汇,插入所以权值比L小的边,每条边流量为1,跑最小割,求出来的答案就是使源.汇不联通最少删掉边.最大生成树同理,插入的是权值比L大…
如果出现在最小生成树上,那么此时比该边权值小的边无法连通uv.据此跑最小割(最大流)即可. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(x,c,sizeof(x)) int read(…
对于新加入的边,必须要既可能在最小生成树上也可能在最大生成树上我们先对于最小生成树考虑根据kruskal的理论,不难发现,u--v 长度为L的边可能出现在最小生成树上就是说删边剩下的比L小的边一定不能使u,v连通,因此问题就转化为求u,v两点的最小割了最大生成树同理,最后答案是两个加起来 ; type node=record point,next,flow:longint; end; ..] of node; cur,p,h,numh,pre,d:..] of longint; x,y,z:..…
题目描述 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上? 输入 第一行包含用空格隔开的两个整数,分别为N和M:接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v).最后一行包含用空格隔开的三个整数,分别为u,v,和 L:数据保证图中没有自环. 输出…
https://www.lydsy.com/JudgeOnline/problem.php?id=2561 考虑Kruscal算法求最小生成树的流程 如果 u和v之间的长为L的边能出现在最小生成树里,说明<L的边不能时u和v联通 即求图中只存在<L的边时,u和v的最小割 如果 u和v之间的长为L的边能出现在最大生成树里,说明>L的边不能时u和v联通 即求图中只存在>L的边时,u和v的最小割 #include<cstdio> #include<queue> #…
嗯……这题是一个网络流. 加入的边为u,v长度L 则所有长度大于L的边不能使得u,v连通 求个最小割即可.小于同理 两次最小割结果相加. #include<bits/stdc++.h> #define N 200005 #define M 1000005 #define inf 1000000007 using namespace std; ,head[N],s,t; struct Edge1{int u,v,w;}T[N]; struct Edge2{int u,v,f,next;}G[M]…
题目描述 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上? 输入 第一行包含用空格隔开的两个整数,分别为N和M:接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v).最后一行包含用空格隔开的三个整数,分别为u,v,和 L:数据保证图中没有自环. 输出…