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算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
随机推荐
- JfreeChart折线图 CSDN-李鹏飞
今天公司里分配给我的工作是JfreeChart折线图本人之前也没接触过如今让我们大家一起完毕! 在这个公司,用到了太多的JfreeChart,今天就对折线图作一个总结,希望对大家有点帮助,我这里直接是 ...
- layer弹层
获得 layer 文件包后,解压并将 layer 整个文件夹(不要拆分结构) 存放到你项目的任意目录,使用时,只需引入 layer.js 即可. 注意:引入layer.js前必须先引入jquery1. ...
- List 调用 remove 方法时抛出 java.lang.UnsupportedOperationException 异常原因
原因 使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作. Arrays.asList(arr) 返回的类型是 Aarrays$Arr ...
- HTML canvas
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- C++设计模式之State模式
这里有两个例子: 1.https://www.cnblogs.com/wanggary/archive/2011/04/21/2024117.html 2.https://www.cnblogs.co ...
- android user 版本如何默认adb调试为打开【转】
本文转载自:http://blog.csdn.net/chaihuasong/article/details/50342119 A. 软件准备 user版本需要先打开USB debug开关,打开方式如 ...
- include <ctype.h> 头文件包含函数总结
里面包含的函数主要是: 1.字符测试函数,函数原型一般为:int isXXXX( int ); 参数为int, 只能正确处理[0, 127]. 2.字符映射函数,函数原型一般为:int toXXXX( ...
- POJ2516 Minimum Cost —— 最小费用最大流
题目链接:https://vjudge.net/problem/POJ-2516 Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Tota ...
- DEDECMS织梦自定义表单中必填项、电话邮箱过滤以及验证码规则
织梦自定义表单必填项规则--->(wwwshu-acca.com网站表单) 1. 在plus/diy.php 的第 40行下加如下代码: 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- jQuery常用插件大全(9)ResponsiveSlides插件
ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件(tiny responsive slideshow jQuery plugin).它支持包括IE6在 ...