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

---------------------------------------------------------------------

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define rep(i,n) for(int i=0;i<n;++i)
#define clr(x,c) memset(x,c,sizeof(x))
#define Rep(i,l,r) for(int i=l;i<r;++i)
using namespace std;
const int inf=0x7fffffff;
const int maxn=20002+5;
struct Edge {
int from,to,cap,flow;
Edge(int u,int v,int c):
from(u),to(v),cap(c),flow(0) {}
};
struct edge {
int u,v,w;
bool operator < (const edge &e) const {
return w<e.w;
}
};
vector<edge> Edges;
struct ISAP {
int n,s,t;
int d[maxn];
int cur[maxn];
int num[maxn];
int p[maxn];
vector<int> g[maxn];
vector<Edge> edges;
void init(int n) {
this->n=n;
rep(i,n) g[i].clear();
edges.clear();
}
void addEdge(int u,int v,int cap) {
edges.push_back( Edge(u,v,cap) );
edges.push_back( Edge(v,u,0) );
int m=edges.size();
g[u].push_back(m-2);
g[v].push_back(m-1);
}
int augment() {
int a=inf,x=t;
while(x!=s) {
Edge &e=edges[p[x]];
a=min(e.cap-e.flow,a);
x=e.from;
}
x=t;
while(x!=s) {
edges[p[x]].flow+=a;
edges[p[x]^1].flow-=a;
x=edges[p[x]].from;
}
return a;
}
int maxFlow(int s,int t) {
this->s=s; this->t=t;
clr(cur,0); clr(num,0);
clr(d,0); num[0]=n;
int flow=0,x=s;
while(d[s]<n) {
if(x==t) {
flow+=augment();
x=s;
}
int ok=0;
Rep(i,cur[x],g[x].size()) {
Edge &e=edges[g[x][i]];
if(e.cap>e.flow && d[e.to]+1==d[x]) {
ok=1;
p[e.to]=g[x][i];
cur[x]=i;
x=e.to;
break;
}
}
if(!ok) {
int m=n-1;
rep(i,g[x].size()) {
Edge &e=edges[g[x][i]];
if(e.cap>e.flow) m=min(m,d[e.to]);
}
if(!--num[d[x]]) break;
num[d[x]=m+1]++;
cur[x]=0;
if(x!=s) x=edges[p[x]].from;
}
}
return flow;
}
} g;
int main()
{
freopen("test.in","r",stdin);
Edges.clear();
int n,m; scanf("%d%d",&n,&m);
int u,v,w;
while(m--) {
scanf("%d%d%d",&u,&v,&w);
Edges.push_back( (edge) {u-1,v-1,w} );
}
sort(Edges.begin(),Edges.end());
int U,V,L;
scanf("%d%d%d",&U,&V,&L); --U; --V;
g.init(n);
rep(i,Edges.size()) {
edge &e=Edges[i];
if(e.w>=L) break;
g.addEdge(e.u,e.v,1);
g.addEdge(e.v,e.u,1);
}
int ans=g.maxFlow(U,V);
g.init(n);
for(int i=Edges.size()-1;i>=0;--i) {
edge &e=Edges[i];
if(e.w<=L) break;
g.addEdge(e.u,e.v,1);
g.addEdge(e.v,e.u,1);
}
ans+=g.maxFlow(U,V);
printf("%d\n",ans);
return 0;
}

---------------------------------------------------------------------

2561: 最小生成树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 727  Solved: 359
[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

2012国家集训队Round 1 day1

转载于:https://www.cnblogs.com/JSZX11556/p/4393251.html

BZOJ 2561: 最小生成树(最小割)相关推荐

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

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

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

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

  3. bzoj 3144(最小割)

    传送门 最小割,主要考查建边的思路.本蒟蒻也是看了好几位大佬的博客才看懂.比如: 参考1 参考2 (x,y,z)连接(x,y,z+1)容量为f(x,y,z) (x,y,z)连接(x',y',z-d)容 ...

  4. Bzoj 2127 happiness 最小割

    happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) = 文科值 flow(u,t) = 理科值 假设u 和 v 一起选 ...

  5. BZOJ 2400(网络流最小割)

    思路: 首先比较显然能够想到二进制拆分 每一位的贡献是独立的 然后可以用最小割解决 S->i 表示这一个位置是0 inf i-T 表示为1 inf 然后所有的边保留 1 这样只要最后再找一遍t集 ...

  6. BZOJ 2127 happiness (最小割)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2127 题解: 这道题就是传说中的"解方程"法.(貌似也有类似于BZ ...

  7. 最小割树:证明与例题

    Definition 对于一张图(有向/无向),都能建立一棵Gomory-Hu Tree,树中节点对应图中节点,树上两点间的最小割等于图中两点间的最小割. Algorithm 1.任取两个点s,t求出 ...

  8. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  9. BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...

最新文章

  1. Java服务部署规范(内部使用)
  2. java .classpath配置_轻松玩转Java配置的Classpath
  3. Linux 操作系统原理 — 内存 — 基于 MMU 硬件单元的虚/实地址映射技术
  4. leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)
  5. 云炬随笔20171103
  6. MySQL InnoDB存储引擎
  7. 正则表达式之反向引用
  8. 浅学习使用Ribbon 和 Feign的理解和使用
  9. 周鸿祎:谷歌Chrome不是浏览器
  10. xtrabackup备份还原MySQL数据库
  11. elasticsearch的rest搜索--- 查询
  12. Android 四大组件学习之BroadcastReceiver三
  13. 程序员的寂寞,你们不懂
  14. Maven的下载安装和配置阿里云镜像教程
  15. 前端3D轨迹可视化渲染
  16. jacob实现ppt转图片时存在的问题
  17. 为什么百度查ip查到的ip和dos里面ipconfig查到的不一样及IPv4地址分类
  18. (3)数仓建设-数据仓库设计方案
  19. 田径运动会成绩管理系统
  20. linux服务器监控工具

热门文章

  1. MySQL-数据库和表的基本操作
  2. ubunto安装mysql8.13_ubuntu安装mysql[ubuntu部署]
  3. emmc linux.格式化参数,SD卡, EMMC固化 ,关于bootloader linux
  4. php修改http header,php header函数的常用http头设置
  5. 网络推广网站总结降低网站跳出率的技巧有哪些?
  6. SEO优化如何“搭乘”线上营销推广“列车”?
  7. 量子计算机物理学,百年的超越:量子物理学与量子计算机
  8. maya mel uf8_MAYA MEL问题
  9. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
  10. pythongps聚类_python实现K聚类算法