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

BZOJ 2561: 最小生成树(最小割)的更多相关文章

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

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

  2. BZOJ 2561 最小生成树 | 网络流 最小割

    链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...

  3. bzoj 2561: 最小生成树【最小割】

    看错题了以为多组询问吓得不行-- 其实还挺好想的,就是数据范围一点都不网络流.把U作为s,V作为t,以最小生成树为例,(U,V,L)要在最小生成树上,就要求所有边权比L小的边不能连通(U,V)所在的联 ...

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

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

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

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

  6. BZOJ 2561 最小生成树(最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2561 题意:给定一个边带正权的连通无向图G= (V,E),其中N=|V|,M=|E|,N ...

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

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

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

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

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

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

随机推荐

  1. ceph伦理概念

    Preface: CEPH: THE FUTURE OF STORAGE(未来存储) Ceph was made possible by a global community of passionat ...

  2. C语言数据结构----栈的应用(程序的符号匹配检测)

    本节主要讲利用栈来实现一个程序中的成对出现的符号的检测,完成一个类似编译器的符号检测的功能,采用的是链式栈. 一.问题的提出以及解决方法 1.假定有下面一段程序: #include <stdio ...

  3. Pig Latin儿童黑话(java)

     ●假设单词以辅音字母開始,将词首的辅音字母字符串(第一个元音字母前的全部字母)从单词的开头移动到末尾,然后加上后缀ay,这样就形成了它的pig  latin. ●假设单词以元音字母開始,仅仅须要 ...

  4. 为什么没有好用的Android游戏引擎?

    随着Android平台的不断发展,最近Android开发人员数量呈现出上升势头,就连以往较为冷门的游戏开发领域也涌现出不少生力军.然而,全新的问题正摆在了刚開始学习的人面前,非常多他们从未遇过的问题開 ...

  5. spm3 基本

    spm3 命令 spm init //初始化一个spm模块,会生成基本配置以及测试文件等(下图). //注 初始化以后一般需要 鲜执行一下 spm install 安装默认依赖模块 index.js就 ...

  6. 关于ECMAScript6一些知识

    ECMAScript 是当前 JavaScript 语言规范的最新标准,一般称为 es6, 但是因为 该标准规范是在 2015年6月份发布的,所以也叫作 ECMAScript 2015 let 变量声 ...

  7. hdu4741

    2013年两场网络赛已经过了,之前的现场赛拿了多次铜牌,而这两场网络赛我们都表现得这么水,不由得感慨起来,ACM竞赛生涯就要画上句号了,甚至整个学习生涯中这种纯学术的竞赛都要完了.这两场网络表现得不好 ...

  8. 浅谈Hash函数

    什么是hash函数: hash函数也可以翻译成“散列”函数,一般就使用音译“哈希”函数,简单的说哈希函数是对任意长度的输入进行的压缩映射,所谓的压缩映射顾名思义,输出通常来说要比输入短,并且得到的输出 ...

  9. 常用的Linux操作命令(一)

    ls 目录 mkdir 创建文件夹 vi 新建文件 :w filename 将文章存入指定的文件名filename :wq 保存并退出编辑文件 :q! 强制离开并放弃编辑的文件 cd 切换到目录/ro ...

  10. java实现cmd的copy功能

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...