HDOJ 5409 CRB and Graph
2015-08-21 19:22
281 查看
从n开始做tarjan,如果一条边不是桥,那么就输出0 0,否则求子树的最大编号。。。
#include <bits/stdc++.h> using namespace std; typedef long long LL; #define mp(x, y) make_pair(x, y) const int maxn = 100005; const int maxm = 200005; struct Edge { int v, next; Edge(int v = 0, int next = 0) : v(v), next(next) {} }E[maxm]; pair<int, int> res[maxn]; int H[maxn], cntE; int dfn[maxn]; int low[maxn]; int mx[maxn]; int n, m, dfs_clock; void addedges(int u, int v) { E[cntE] = Edge(v, H[u]); H[u] = cntE++; E[cntE] = Edge(u, H[v]); H[v] = cntE++; } void init() { cntE = dfs_clock = 0; memset(dfn, 0, sizeof dfn); memset(H, -1, sizeof H); } void tarjan(int u, int fa) { mx[u] = u; dfn[u] = low[u] = ++dfs_clock; for(int e = H[u]; ~e; e = E[e].next) if(E[e].v != fa) { int v = E[e].v; if(!dfn[v]) { tarjan(v, u); low[u] = min(low[u], low[v]); } else low[u] = min(low[u], dfn[v]); } for(int e = H[u]; ~e; e = E[e].next) if(E[e].v != fa) { int v = E[e].v; mx[u] = max(mx[u], mx[v]); if(low[v] > dfn[u]) res[e / 2] = mp(mx[v], mx[v]+1); else res[e / 2] = mp(0, 0); } } void work() { scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); addedges(u, v); } tarjan(n, n); for(int i = 0; i < m; i++) printf("%d %d\n", res[i].first, res[i].second); } int main() { int _; scanf("%d", &_); while(_--) { init(); work(); } return 0; }
相关文章推荐
- HDU 2149 Public Sale
- C++类所占空间总结
- linux网络编程学习笔记之四 -----多-threaded服务器
- 杭电2899Strange fuction 求导+二分
- flume.hadoop.hdfs.频繁滚动小文件问题
- POJ 1469
- hdu 5414 CRB and String(想法题)
- java静态绑定和动态绑定小结
- 用国内软件源为Ubuntu的apt-get提速
- samba的搭建和权限控制
- Evaluate Reverse Polish Notation
- 嵌入指南|Chrome V8
- curl post json
- js 的一维数组,二维数组
- JAVA运行程序代码段
- 图片缩放和多点触控
- Codeforces Gym 100338B Spam Filter 字符串哈希+贝叶斯公式
- android 组件 ProgressDialog实例
- hdoj 2066 一个人的旅行【最短路的3种写法】
- 归档和解挡