BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解)
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1628 Solved: 786
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2561
Description
给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上?
Input
接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v)。
最后一行包含用空格隔开的三个整数,分别为u,v,和 L;
数据保证图中没有自环。
Output
输出一行一个整数表示最少需要删掉的边的数量。
Sample Input
3 2 1
1 2 3
1 2 2
Sample Output
HINT
对于20%的数据满足N ≤ 10,M ≤ 20,L ≤ 20;
对于50%的数据满足N ≤ 300,M ≤ 3000,L ≤ 200;
对于100%的数据满足N ≤ 20000,M ≤ 200000,L ≤ 20000。
#include<iostream>
#include<fstream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<deque>
#include<utility>
#include<map>
#include<set>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<functional>
#include<sstream>
#include<cstring>
#include<bitset>
#include<stack>
using namespace std; int n,m,s,t,cnt,x,y,z,ansx,l;
struct sdt
{
int cap,flow,u,v;
}e[400005];
struct bdq
{
int a,b,c;
}edge[200005];
int nxt[400005],fir[20005],d[20005],par[20005],num[20005],cur[20005];
bool vis[20005]; int read()
{
int x=0;char c=getchar();
while(c<48||c>57)c=getchar();
while(c>47&&c<58)x*=10,x+=c-48,c=getchar();
return x;
} void bfs()
{
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
queue<int>q;
d[t]=0;
vis[t]=1;
q.push(t);
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=fir[k];i;i=nxt[i])
{
if(!vis[e[i].v])
{
vis[e[i].v]=1;
d[e[i].v]=d[k]+1;
q.push(e[i].v);
}
}
}
} int agument()
{
int p=t;
int ans=2147483647;
while(p!=s)
{
ans=min(ans,e[par[p]].cap-e[par[p]].flow);
p=e[par[p]].u;
}
p=t;
while(p!=s)
{
e[par[p]].flow+=ans;
e[par[p]^1].flow-=ans;
p=e[par[p]].u;
}
return ans;
} int isap()
{
memset(num,0,sizeof(num));
int flow=0;
for(int i=1;i<=n;i++)
{
num[d[i]]++;
cur[i]=fir[i];
}
int p=s;
while(d[s]<n)
{
if(p==t)
{
flow+=agument();
p=s;
}
bool ok=0;
for(int i=cur[p];i;i=nxt[i])
{
if(e[i].cap>e[i].flow && d[p]==d[e[i].v]+1)
{
ok=1;
par[e[i].v]=i;
cur[p]=i;
p=e[i].v;
break;
}
}
if(!ok)
{
int mn=n-1;
for(int i=fir[p];i;i=nxt[i])
{
if(e[i].cap>e[i].flow)mn=min(mn,d[e[i].v]);
}
if(--num[d[p]]==0)break;
num[d[p]=mn+1]++;
cur[p]=fir[p];
if(p!=s)p=e[par[p]].u;
}
}
return flow;
} int main()
{
memset(nxt,0,sizeof(nxt));
memset(fir,0,sizeof(fir));
n=read();m=read();
cnt=1;
for(int i=1;i<=m;i++)
{
edge[i].a=read();edge[i].b=read();edge[i].c=read();
}
s=read();t=read();l=read();
for(int i=1;i<=m;i++)
{
if(edge[i].c<l)
{
x=edge[i].a;
y=edge[i].b;
e[++cnt].u=x;e[cnt].v=y;e[cnt].cap=1;e[cnt].flow=0;
nxt[cnt]=fir[x];fir[x]=cnt;
e[++cnt].u=y;e[cnt].v=x;e[cnt].cap=1;e[cnt].flow=0;
nxt[cnt]=fir[y];fir[y]=cnt;
}
}
bfs();
ansx+=isap();
cnt=1;
memset(nxt,0,sizeof(nxt));
memset(fir,0,sizeof(fir));
memset(e,0,sizeof(e));
for(int i=1;i<=m;i++)
{
if(edge[i].c>l)
{
x=edge[i].a;
y=edge[i].b;
e[++cnt].u=x;e[cnt].v=y;e[cnt].cap=1;e[cnt].flow=0;
nxt[cnt]=fir[x];fir[x]=cnt;
e[++cnt].u=y;e[cnt].v=x;e[cnt].cap=1;e[cnt].flow=0;
nxt[cnt]=fir[y];fir[y]=cnt;
}
}
bfs();
ansx+=isap();
printf("%d\n",ansx);
return 0;
}
BZOJ-2561-最小生成树 题解(最小割)的更多相关文章
- BZOJ 2561 最小生成树 | 网络流 最小割
链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...
- bzoj 2561: 最小生成树【最小割】
看错题了以为多组询问吓得不行-- 其实还挺好想的,就是数据范围一点都不网络流.把U作为s,V作为t,以最小生成树为例,(U,V,L)要在最小生成树上,就要求所有边权比L小的边不能连通(U,V)所在的联 ...
- BZOJ 2561: 最小生成树【最小割/最大流】
Description 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v), ...
- BZOJ_2561_最小生成树_最小割
BZOJ_2561_最小生成树_最小割 题意: 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条 ...
- BZOJ 2561: 最小生成树(最小割)
U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...
- bzoj千题计划322:bzoj2561: 最小生成树(最小割)
https://www.lydsy.com/JudgeOnline/problem.php?id=2561 考虑Kruscal算法求最小生成树的流程 如果 u和v之间的长为L的边能出现在最小生成树里, ...
- BZOJ 2521: [Shoi2010]最小生成树(最小割)
题意 对于某一条无向图中的指定边 \((a, b)\) , 求出至少需要多少次操作.可以保证 \((a, b)\) 边在这个无向图的最小生成树中. 一次操作指: 先选择一条图中的边 \((u, v)\ ...
- 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 【bzoj2561】最小生成树 网络流最小割
题目描述 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最 ...
- BZOJ2561 最小生成树 【最小割】
题目 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多 ...
随机推荐
- Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境【转】
项目建设完成之后的结构: 数据库的表结构如下: 环境建设:搭建Maven环境.Tomcat环境.需要MySql 数据库支持,使用的编程工具Eclipse (这些是前期准备): 开始创建工程: 1.创建 ...
- Atitit java集成内嵌浏览器与外嵌浏览器attilax总结
Atitit java集成内嵌浏览器与外嵌浏览器attilax总结 HTML5将颠覆原生App世界.这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟 ...
- CSS3 border-radius 圆角属性
使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. -webkit- 或 -moz- ...
- CuPlayer
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- 关于JS交互--调用h5页面,点击页面的按钮,分享到微信朋友圈,好友
关于js交互,在iOS中自然就想到了调用代理方法 另外就是下面的,直接上代码了: 如果你的后台需要知道你的分享结果,那么,就在回调里面调用上传到服务器结果的请求即可
- 【代码笔记】iOS-页面调的时候隐藏工具条
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- mysql 自定义函数
原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...
- SQL中几个常用的排序函数
最近使用窗口函数的频率越来越高,这里打算简单介绍一下几个排序的函数,做一个引子希望以后这方面的问题能够更深入的理解,这里先简单介绍一下几个简单的排序函数及其相关子句,这里先从什么是排序开始吧 ...
- mysql查询本周、月、季度、年
#查询本周记录 select * from product_process where WEEKOFYEAR(update_time)=WEEKOFYEAR(now()); #查询本月数据 selec ...