2561: 最小生成树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2685  Solved: 1253
[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。


Solution

完全看不出是网络流QAQ.....

很神奇的想法...

要使加的边在最小生成树上,就要使原图中所有能连接$u,v$的边并且长度小于$L$的通路被切断,最大生成树同理。

所以就是以$u,v$为源汇点跑最小割。重新建边。

为什么可以建双向边?因为这道题没确定方向,所以双向边是必要的。而在bfs中从源点出发更新其他点的$dep$,相当于是确定了方向,所以双向边也可以跑最小割了。

Code

#include<bits/stdc++.h>
using namespace std; inline void read(int &x) {
x = ; char ch = getchar();
while(ch > '' || ch < '') ch = getchar();
while(ch >= '' && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
} struct Node {
int u, v, f, nex;
Node(int u = , int v = , int nex = , int f = ) :
u(u), v(v), nex(nex), f(f) { }
} Edge[]; struct Init {
int u, v, w;
} a[]; int stot = , h[];
void add(int u, int v, int f) {
Edge[++stot] = Node(u, v, h[u], f);
h[u] = stot;
Edge[++stot] = Node(v, u, h[v], );
h[v] = stot;
} int n, m, s, t, w;
int vis[], dep[];
bool bfs() {
memset(vis, , sizeof(vis));
memset(dep, , sizeof(dep));
queue < int > q;
q.push(s); vis[s] = ;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(!vis[v] && Edge[i].f) {
dep[v] = dep[u] + ;
vis[v] = ;
q.push(v);
}
}
}
return vis[t];
} int dfs(int u, int delta) {
if(u == t || !delta) return delta;
int res = ;
for(int i = h[u]; i && delta; i = Edge[i].nex) {
int v = Edge[i].v;
if(dep[v] == dep[u] + && Edge[i].f) {
int dd = dfs(v, min(delta, Edge[i].f));
Edge[i].f -= dd;
Edge[i ^ ].f += dd;
res += dd; delta -= dd;
}
}
return res;
} int main() {
scanf("%d%d", &n, &m);
for(int i = ; i <= m; i ++)
read(a[i].u), read(a[i].v), read(a[i].w);
read(s), read(t), read(w);
for(int i = ; i <= m; i ++)
if(a[i].w < w) add(a[i].u, a[i].v, ), add(a[i].v, a[i].u, );
int t1 = , t2 = ;
while(bfs()) t1 += dfs(s, 0x3f3f3f3f);
stot = ; memset(h, , sizeof(h));
for(int i = ; i <= m; i ++)
if(a[i].w > w) add(a[i].u, a[i].v, ), add(a[i].v, a[i].u, );
while(bfs()) t2 += dfs(s, 0x3f3f3f3f);
printf("%d", t1 + t2);
return ;
}

【BZOJ】2561: 最小生成树【网络流】【最小割】的更多相关文章

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

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

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

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

  3. BZOJ 2561: 最小生成树【最小割/最大流】

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

  4. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割

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

  5. 【bzoj2561】最小生成树 网络流最小割

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

  6. BZOJ_2561_最小生成树_最小割

    BZOJ_2561_最小生成树_最小割 题意: 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条 ...

  7. 【题解】 bzoj3894: 文理分科 (网络流/最小割)

    bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...

  8. 【bzoj3774】最优选择 网络流最小割

    题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...

  9. 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割

    题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...

  10. 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan

    题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...

随机推荐

  1. 一、springcloud服务注册、发现、调用(consul/eureka)

    1.Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  2. pycharm tornado 项目 配置

    ycharm 配置tornado项目 使得能够像django项目一样运行

  3. JQuery中DOM事件合成用法

    jQuery有两个合成事件——hover()方法和toggle()方法 类似前面讲过的ready()方法,hover()方法和toggle()方法都属于jQuery自定义的方法. hover()方法: ...

  4. P1986 元旦晚会

    一道可以用各种各样的办法做的(水)题 在这里就介绍两种做法 题意: 自己看看吧,很明显的意思,就是求前i个人最少有多少个话筒. 解法1:差分约束 设\(dis[i]\)表示前\(i\)个人最少有多少个 ...

  5. JQ实现情人节表白程序

    JQ实现情人节表白页面 效果图: 表白利页,你值得拥有哦! 代码如下,复制即可使用: <!doctype html> <html> <head> <meta ...

  6. 网络协议之NAT穿透

    NAT IPv4地址只有32位,最多只能提供大致42.9亿个唯一IP地址,当设备越来越多时,IP地址变得越来越稀缺,不能为每个设备都分配一个IP地址.于是,作为NAT规范就出现了.NAT(Networ ...

  7. 如何用纯CSS布局两列,一列固定宽度,另一列自适应?

    大家都知道好多网站都是左右布局的,很多公司在笔试和面试环节也常常问这个问题.一个去网易的师兄说14年腾讯面试的时候问过这个问题,网易在笔试和面试时候也问过这个问题,还有很多互联网公司也都涉及到这个问题 ...

  8. Maven3 生命周期与插件(笔记五)

    第一节:Maven 生命周期 Maven 生命周期简介:Maven 通过插件的方式完成一系列过程来实现功能. Maven 拥有三套独立的生命周期: Clean 清理项目 Default 构建项目 Si ...

  9. 专业分析docker的分层存储技术

    话不在多,指明要点! 联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径, 是下层存储驱动(aufs.overlay等) 实现分层合并的方式. 所以严格来说,联合挂载 ...

  10. Spark(七)Spark内存调优

    一.概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文 ...