HDU

# 题意

有一个简单图,n个点,m条边。对于每条割边,求出删去这条边后,在两个联通块中各取一个u,v。使得u<v,并且u尽量大而v尽量小。

# 思路

求出边双联通是肯定的。

答案的限制条件是重点。

假设分出来的两个联通块,一个的最大值是mx1,另一个的最大值是mx2。那么u = min(mx1, mx2),因为取个小点的,才能在另一个联通块中找到对应的v。

显然mx1,mx2中一个值等于n,所以我们只用找不包含n的联通块中的最大值。

怎么找,可以令n为根结点,dfs子树的最大值就行了。

又由于v越小越好,我们可以直接令v = u + 1;

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a)typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }template<typename T>
inline T read(T&x){x=0;int f=0;char ch=getchar();while (ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x=f?-x:x;
}const int inf = 0x3f3f3f3f;const int mod = 1e9+7;/**********showtime************/const int maxn = 1e5+9;vector<pii>mp[maxn];set   <pii>nmp[maxn];int dfn[maxn],low[maxn],belong[maxn],tim;int scc_cnt;int ans[maxn];int a[maxn], dp[maxn];stack<int>st;void dfs(int u, int fa) {dfn[u] = low[u] = ++tim;st.push(u);for(pii p : mp[u]){int v = p.fi;if(v == fa) continue;if(!dfn[v]) dfs(v, u);if(!belong[v]) low[u] = min(low[u], low[v]);}if(low[u] == dfn[u]) {scc_cnt++;nmp[scc_cnt].clear();int now;while(true){now = st.top(); st.pop();belong[now] = scc_cnt;a[scc_cnt] = max(a[scc_cnt], now);if(now == u) break;}}}void cal(int u, int fa) {dp[u] = a[u];for(pii p : nmp[u]) {int v = p.fi, id = p.se;if(v == fa) continue;cal(v, u);ans[id] = dp[v];dp[u] = max(dp[u], dp[v]);}}
int main(){int T;  scanf("%d", &T);while(T--) {int n,m;scanf("%d%d", &n, &m);for(int i=1; i<=n; i++) mp[i].clear(), dfn[i] = 0,dp[i] = 0, a[i] = 0,belong[i] = 0;for(int i=1; i<=m; i++) {int u,v;scanf("%d%d", &u, &v);mp[u].pb(pii(v, i));mp[v].pb(pii(u, i));ans[i] = 0;}tim = 0;scc_cnt = 0;for(int i=1; i<=n; i++) if(!dfn[i]) dfs(i, i);for(int u=1; u<=n; u++) {for(pii p : mp[u]) {int v = p.fi;if(belong[u] == belong[v]) continue;nmp[belong[u]].insert(pii(belong[v], p.se));}}cal(belong[n], belong[n]);for(int i=1; i<=m; i++) printf("%d %d\n", ans[i], ans[i] + (ans[i] != 0));}return 0;
}

View Code

转载于:https://www.cnblogs.com/ckxkexing/p/11191326.html

【HDU5409】CRB and Graph 边双联通 子树最值相关推荐

  1. Tarjan点的双联通(寻找割点)

    问题概述:给你一个无向联通图,你要在图中标记一些点,使得这个图中的任意一个点消失了,剩余的点都可以通 过一条路径到达你某个标记的点.问你最少需要选择多少个点,并且在最优的情况下有多少总选点方案,(每个 ...

  2. 强连通分量/点双连通分量/边双联通分量 总结

    前言 % 被某brz逼着问,觉得很有必要好好复习一下这 些 毒瘤东西. 定义 % 连通 如果有向图中的两点 uuu,vvv 间同时存在 uuu 到 vvv 的路径及 vvv 到 uuu 的路径,则称点 ...

  3. 强联通分量,双联通分量详解

    正题 强联通分量 我们开两个数组 l o w , d f n low,dfn low,dfn . d f n dfn dfn 表示 i i i 点的 d f s dfs dfs 序, l o w lo ...

  4. poj3177(双联通分量)

    题意:就是在加多少边才能使这个图变成双联通图 思路:利用dfs求出连通分量的个数ans,再将这些连通分量看成是新点,也就是进行缩点,求出这些缩点的出度,记录出度为0的点,边的个数求法就是(ans1+1 ...

  5. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  6. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

  7. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  8. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  9. 10.31T2 点双联通分量+预处理前缀+二分答案

    2.逛公园I  (parka) [问题描述] 琥珀色黄昏像糖在很美的远方,思念跟影子在傍晚一起被拉长--       小 B 带着 GF 去逛公园,公园一共有 n 个景点,标号为 1 . . . n. ...

  10. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

最新文章

  1. 两个函数式解决大数相加的方法
  2. 网络编程学习笔记(recvfrom和sendto函数)
  3. 【求推荐】优化SAP使用效率的RPA工具推荐
  4. linux字符设备开发
  5. 9. 弹出键盘挡住input
  6. [HDU517] 小奇的集合
  7. Spark 101:它是什么,它做什么以及为什么起作用
  8. JFinal interceptor - Deal with session attributes
  9. 花前月下网易云等级代挂多功能助手程序v1.2
  10. 构造方法的应用 0107 c#
  11. 奇安信代码安全实验室帮助微软修复两个“重要”漏洞,获官方致谢
  12. 网站 测试服务器配置,安装调试、软件测试、网站测试 配置维护环境配置、安全维护、安全运维等与服务器相关业务...
  13. 工时分析怎么分析?分享:实用的工时分析方法及软件工具!
  14. linux版的微博客户端,推荐Ubuntu Linux下的新浪微博客户端
  15. XP系统优化简单实用技法
  16. 关于计算机团队名字大全集,好听的团队名字大全
  17. Unity自定义组件之序列帧播放组件
  18. 动态规划法和贪心算法
  19. Python处理CSV文件(二)
  20. pads元件类型如何修改_在PADS里怎样修改PCB的元件编号

热门文章

  1. 拓端tecdat|在Python和R中使用交叉验证方法提高模型性能
  2. 拓端tecdat|Tableau 数据可视化:探索性图形分析新生儿死亡率数据
  3. 文献阅读 Fully Convolutional Networks for Semantic Segmentation
  4. (10)数据分析-变量分析
  5. FreeRTOS基础认识
  6. 深度学习常用的数据集,包括各种数据跟图像数据
  7. Linux怎么登录redis数据库,Linux 系统上 Redis 数据库的 安装 部署 使用
  8. linux系统yum提示注册,Linux:redhat6.5使用yum时提示需要注册问题解决方案
  9. CURL不能访问 但浏览器可以访问
  10. C++ std::vector 自定义排序