【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
PROBLEM
SOLUTION
楠神口胡算法我来实现系列
从小到大枚举边权,对于当前的权值,在当前的图找出所有等于该权值的边,把这些边的顶点用其在并查集中的代表元(即fa[x])替换,然后建图,求所建图的桥边。求完之后把每条边的两个顶点合并(缩点),然后枚举下一个权值。最后统计桥边数量和就是答案。
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 5;
struct edge {
int v, w, nex;
} ed[MAXN * 2];
int head[MAXN], tot;
void addedge(int u, int v,int w) {
tot++;
ed[tot].v = v;
ed[tot].w = w;
ed[tot].nex = head[u];
head[u] = tot;
}
set<int> ss;
struct data{
int ind,w;
}eg[MAXN*2];
bool cmp(data a,data b){
return a.w<b.w;
}
int n,m;
bool bridge[MAXN*2];
int dfn[MAXN],low[MAXN],num;
vector<pair<int,int>> g[MAXN];
set<int> nd;
int fa[MAXN];
int DjsGet(int x){
if(x==fa[x])return x;
return fa[x] = DjsGet(fa[x]);
}
void tarjan(int x,int in_edge){
dfn[x] = low[x] = ++num;
for(auto ver:g[x]){
int y = ver.first;
int i = ver.second;
if(!dfn[y]){
tarjan(y,i);
low[x] = min(low[x],low[y]);
if(low[y]>dfn[x]){
bridge[i] = bridge[i^1] = true;
}
}
else if(i!=(in_edge^1))
low[x] = min(low[x],dfn[y]);
}
}
int main() {
scanf("%d%d%*d",&n,&m);
tot = 1;
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
ss.insert(w);
eg[i]= {i*2,w};
}
sort(eg+1,eg+m+1,cmp);//边按权值从小到大排序
for(int i = 1;i<=n;i++)fa[i] = i;
int pos = 1;
for(auto curval:ss){
int pre = pos;
//建子图
for(pos;eg[pos].w<=curval&&pos<=m;pos++){
int ind = eg[pos].ind;
int x = ed[ind^1].v,y = ed[ind].v;
int fx = DjsGet(x);
int fy = DjsGet(y);
if(fx==fy)continue;
g[fx].push_back(make_pair(fy,ind));
g[fy].push_back(make_pair(fx,ind^1));
nd.insert(fx);
nd.insert(fy);
}
//求桥
for(auto i:nd){
if(!dfn[i])tarjan(i,0);
}
//init
for(auto i:nd){
dfn[i] = low[i] = 0;
g[i].clear();
}
num = 0;
nd.clear();
//缩点
for(int i= pre;i<pos;i++){
int ind = eg[i].ind;
int x = ed[ind^1].v,y = ed[ind].v;
int fx = DjsGet(x);
int fy = DjsGet(y);
if(fx==fy)continue;
fa[fx] = fy;
}
}
int ans = 0;
for(int i = 2;i<=tot;i+=2){
if(bridge[i])ans++;
}
printf("%d\n",ans);
return 0;
}
【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D的更多相关文章
- POJ 3694 Network(并查集缩点 + 朴素的LCA + 无向图求桥)题解
题意:给你一个无向图,有q次操作,每次连接两个点,问你每次操作后有几个桥 思路:我们先用tarjan求出所有的桥,同时我们可以用并查集缩点,fa表示缩点后的编号,还要记录每个节点父节点pre.我们知道 ...
- UVA 796 Critical Links(无向图求桥)
题目大意:给你一个网络要求这里面的桥. 输入数据: n 个点 点的编号 (与这个点相连的点的个数m) 依次是m个点的 输入到文件结束. 桥输出的时候需要排序 知识汇总: 桥: 无向连通 ...
- UVA 796 Critical Links(模板题)(无向图求桥)
<题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...
- HDU 4738--Caocao's Bridges(重边无向图求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 求1+2+3...+n 牛客网 剑指Offer
求1+2+3...+n 牛客网 剑指Offer 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). ...
- BestCoder冠军赛 - 1009 Exploration 【Tarjan+并查集缩点】
[题意] 给一个图,这个图中既有有向边,又有无向边,每条边只能走一次,问图中是否存在环. 最多10^6个点,10^6个无向边,10^6个有向边 [题解] 因为既有有向边又有无向边,所以不能单纯的用ta ...
- POJ3694:Network(并查集+缩点+lca)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13172 Accepted: 4774 题目链接:htt ...
- 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles
给你一张地图,给你q次询问,每次问你从A点到B点,最大能移动多大的箱子. 把每个点所能容纳的最大箱子求出来(BFS,八连通,一开始将所有边界点和障碍点入队).然后从大到小排序.然后用并查集将相邻(四联 ...
- hdu1811 拓扑排序+并查集缩点
/*给定两个点之间的三种关系 = < >如果是=就将两点放到同一个集合里进行缩点 离线处理所有关系,先用并查集将等于关系缩成一个点 */ #include<bits/stdc++.h ...
随机推荐
- .NET面试题系列(十六)数据库面试题
数据库事务的四大特性 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ...
- WEB内容换行
word-wrap:break-word 单词间换行 word-break:break-all 单词内也可以换行 white-space属性指定元素内的空白怎样处理 normal 默认.空白会被浏览器 ...
- Java部分概念理解
第1部分 方法 1.1 方法基本概念 1) 方法:用于封装一段特定功能代码,尽可能一个方法至只实现一个基本功能,相当于C语言中的函数: 2) 方法可以多次调用: 3) 避免代码冗余,便于维护,便于团队 ...
- 四十九、进程间通信——System V IPC 之消息队列
49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...
- 面试经验合集-Java后端<一>
面试一:CDKHXJSYJS 时间:2018-12-29 周六 地点:航天科技大厦32楼 一 技术题目 <回忆版> 1.上下转型 2.Java异常:分类.处理.设计 3.二叉排序树 ...
- Java基础10-集合
作业回顾 蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉.蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s. 十只蜜蜂和两只熊. 蜜蜂 bag: 20 每次产1,耗时10ms 满5的时候给蜜罐 ...
- perl 之 正则表达式 (简)
正则表达式,简单介绍: 元字符 匹配项 字符类:单字符与数字 . 匹配除换行符之外的任意字符 [a-z0-9] 匹配集中任意单字符 [^a-z0-9] 匹配不在集合中的任意单字符 \d 匹配单个数 ...
- OpenCV掩模mask的原理和作用
一.什么是掩模mask OpenCV中很多函数都带有一个mask参数,mask被称为掩模.图像掩模一般用来对处理的图像(全部或者局部)进行遮挡,来控制图像处理的区域或处理过程. 二.掩模原理 掩模一般 ...
- 【原创】运维基础之yum离线环境安装软件
首先查看系统版本号,然后根据版本号从 CentOS-7-x86_64-DVD-1708.iso 和 CentOS-7-x86_64-Everything-1708.iso 根据需要选择一个下载,我这里 ...
- 【原创】大叔问题定位分享(22)hive同时执行多个insert overwrite table只有1个可以执行
hive 2.1 一 问题 最近有一个场景,要向一个表的多个分区写数据,为了缩短执行时间,采用并发的方式,多个sql同时执行,分别写不同的分区,同时开启动态分区: set hive.exec.dyna ...