hdu 5409 CRB and Graph(边双联通分量)
题意:
给一个图一些边,保证图连通
问对于每条边,如果去除该边后使得图中一些点不连通。设这些点(u,v),要求使u尽量小,v尽量大,输出这样的(u,v)。否则输出0 0。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + ;
typedef pair <int, int>pii;
vector<pii>G[MAXN];
bool isBridge[MAXN];
int clk, pre[MAXN], low[MAXN];
int IDX, maxv[MAXN], newIdx[MAXN], newMax[MAXN];
int U[MAXN], V[MAXN];
int ans[MAXN];
bool vis[MAXN];
int n, m; void init () {
memset(isBridge, false, sizeof (isBridge)); //记录桥
memset(pre, , sizeof (pre)); //记录的第一次访问的时间戳
memset(low, , sizeof (low)); //本身及其子节点能回到的最早的祖先的pre值
clk = ; //时间戳
for (int i = ; i < MAXN; i++) {
G[i].clear();
}
} void DFS (int u, int pa) {
int lowu = pre[u] = ++clk;
for (int i = ; i < G[u].size(); i++) {
pii e = G[u][i];
int v = e.first;
int idx = e.second;
if (!pre[v]) {
DFS(v, u);
lowu = min(lowu, low[v]);
if (low[v] > pre[u]) {
isBridge[idx] = true;
}
} else if (pre[v] < pre[u] && v != pa) {
//是反向边更新lowu
lowu = min(lowu, pre[v]);
}
}
low[u] = lowu; //更改low[u]
} void DFS2(int u, int pa) {
vis[u] = true;
maxv[u] = u;
newIdx[u] = IDX;
for (int i = ; i < G[u].size(); i++) {
pii e = G[u][i];
int v = e.first;
int idx = e.second;
if (!isBridge[idx] && v != pa && !vis[v]) {
DFS2(v, u);
maxv[u] = max(maxv[u], maxv[v]);
}
}
} void BCC_Bridge() {
DFS(, -); //记录桥
memset(vis, false, sizeof (vis));
IDX = ;
for (int i = ; i <= n; i++) {
if (!vis[i]) {
IDX++;
DFS2(i, -); //缩点
}
}
//重新记录缩后的点
for (int i = ; i <= n; i++) {
G[i].clear();
}
for (int i = ; i < m; i++) {
if (isBridge[i]) {
int u = newIdx[U[i]], v = newIdx[V[i]];
G[u].push_back(make_pair(v, i));
G[v].push_back(make_pair(u, i));
}
}
} void solve (int u, int pa) {
pre[u] = ++clk;
ans[u] = newMax[u];
for (int i = ; i < G[u].size(); i++) {
int v = G[u][i].first;
if (v != pa) {
solve(v, u);
ans[u] = max(ans[u], ans[v]);
}
}
} int main() {
int T;
scanf ("%d", &T);
while (T--) {
init(); //进行初始化
scanf ("%d%d", &n, &m);
for (int i = ; i < m; i++) {
int u, v;
scanf ("%d%d", &u, &v);
U[i] = u, V[i] = v;
G[u].push_back(make_pair(v, i));
G[v].push_back(make_pair(u, i));
}
BCC_Bridge();
for (int i = ; i <= n; i++) {
newMax[newIdx[i]] = maxv[i];
}
int u;
for (u = ; u <= n; u++) {
if (newMax[u] == n) {
break;
}
}
memset(pre, , sizeof pre);
clk = ; //重新定义时间戳
solve (u, );
for (int i = ; i < m; i++) {
int u = newIdx[U[i]], v = newIdx[V[i]];
if (u == v) {
printf("0 0\n");
} else {
if (pre[u] < pre[v]) {
swap(u, v);
}
printf("%d %d\n", ans[u], ans[u]+);
}
}
}
return ;
}
hdu 5409 CRB and Graph(边双联通分量)的更多相关文章
- 【HDU5409】CRB and Graph 边双联通 子树最值
HDU # 题意 有一个简单图,n个点,m条边.对于每条割边,求出删去这条边后,在两个联通块中各取一个u,v.使得u<v,并且u尽量大而v尽量小. # 思路 求出边双联通是肯定的. 答案的限制条 ...
- HDU 5409 CRB and Graph 【点双连通+DFS】
<题目链接> 题目大意: 给你一个连通的无向图,问你删除每一条边后,是否能够出现一对(u,v),使得u,v不连通,且u<v,如果有多对u,v,则输出尽量大的u,和尽量小的v. 解题分 ...
- HDU5409---CRB and Graph 2015多校 双联通分量缩点
题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...
- hihocoder #1190 : 连通性·四 点双联通分量
http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
- poj2942(双联通分量,交叉染色判二分图)
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
随机推荐
- HDU 5327 Olympiad (多校)
Olympiad Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 20160222.CCPP体系具体解释(0032天)
程序片段(01):宽字符.c+字符串与内存四区.c 内容概要:宽窄字符 ///宽字符.c #include <stdio.h> #include <stdlib.h> #inc ...
- uboot 对 FAT 分区的解析
uboot 对 FAT 分区的解析 改写 UBOOT 从 U 盘读入固件,然后刷机.发现有的 U 盘无法正确读到分区,跟踪了一下发现自己写的代码有漏洞,只尝试解析分区表里的第一个分区.跟踪的过程中重温 ...
- 一个基本的spring+mybatis所需要的包
spring+mybatis需要的包:org.springframework.spring-webmvc(spring框架DispatcherServlet需要,spring-webmvc会依赖spr ...
- linux地址映射1、2、3(⭐⭐⭐)
欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone 一.线性映射与非线性映射 ...
- Map实现缓存
为什么要使用缓存 缓存最终的目的是为减轻服务端压力,减少网络传输请求 客户端缓存 浏览器访问自带缓存~~ 页面缓存 浏览器缓存 App客户端缓存 IOS 前端开发 底层都有缓存技术的 ( ...
- 一步一步学Silverlight 2系列(12):数据与通信之WebClient
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Oracle:datafile删除后,重启server报ORA-01110
模拟实验: 创建一个表空间后,直接把数据文件删除了:然后重启server. 1. create tablespace w56 datafile '/u01/app/oracle/product/10. ...
- SPOJ:Strange Waca(不错的搜索&贪心&剪枝)
Waca loves maths,.. a lot. He always think that 1 is an unique number. After playing in hours, Waca ...
- Brackets(区间dp)
Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8017 Accepted: 4257 Descript ...