HDOJ-3849(无向图桥)
来源:互联网 发布:阿里云 流量收费标准 编辑:程序博客网 时间:2024/04/30 06:11
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3849
同割顶类似,对于顶点u,如果其存在孩子节点v,使得v及其子孙不存在指向u或者u祖先的边,则(u,v)是一座桥:
#include <cstdio>#include <cstring>#include <map>#include <vector>#include <algorithm>using namespace std;#define MAX_N 10000#define MAX_M 100000//structureint N, M, nextId, dfsClock, pre[MAX_N];struct Edge{ int l, r;} edges[MAX_M];vector<int> bridge;//relationvector<int> relation[MAX_N];//namechar name[MAX_N + 5][16];int index;inline char* getString(){ return name[index++]; }//name->idmap<int,char*> idNameMap;inline char* getNameById(int i){ return idNameMap[i]; }//id->namestruct Comparator{ bool operator () (char* a, char* b){ return strcmp(a, b) < 0; }};typedef map<char*,int,Comparator> Map;Map nameIdMap;Map::iterator iter;bool getIdByName(int& id, char* s, int& nextId){ iter = nameIdMap.find(s); if(iter == nameIdMap.end()){ id = nextId++; nameIdMap.insert(Map::value_type(s, id)); idNameMap.insert(map<int,char*>::value_type(id, s)); return false; } id = iter->second; return true;}int dfs(int x, int fa){ int lowx, y, lowy, a, b; const vector<int>& v = relation[x]; lowx = pre[x] = ++dfsClock; for(int i = 0, n = v.size(); i < n; ++i){ a = edges[v[i]].l; b = edges[v[i]].r; if(a == x) y = b; else y = a; if(pre[y]){ if(y != fa) lowx = min(lowx, pre[y]); } else{ lowy = dfs(y, x); if(lowy > pre[x]) bridge.push_back(v[i]); lowx = min(lowx, lowy); } } return lowx;}void solve(){ dfsClock = 0; bridge.clear(); for(int i = 0; i < nextId; ++i){ if(!pre[i]) dfs(i, -1); } for(int i = 0; i < N; ++i){ if(!pre[i]){ puts("0"); return; } } printf("%u\n", bridge.size()); sort(bridge.begin(), bridge.end()); for(int i = 0, n = bridge.size(); i < n; ++i){ printf("%s %s\n", getNameById(edges[bridge[i]].l), getNameById(edges[bridge[i]].r) ); }}void prepare(){ scanf("%d%d", &N, &M); index = nextId = 0; idNameMap.clear(); nameIdMap.clear(); for(int i = 0; i < N; ++i){ relation[i].clear(); pre[i] = 0; } if(M == 0) return; char* s = getString(), *t = getString(); int x, y; for(int i = 0; i < M; ++i){ scanf(" %s %s", s, t); if(!getIdByName(x, s, nextId)) s = getString(); if(!getIdByName(y, t, nextId)) t = getString(); edges[i].l = x; edges[i].r = y; relation[x].push_back(i); relation[y].push_back(i); }}int main(){ int test; for(scanf("%d", &test); test--; ){ prepare(); solve(); } return 0;}
0 0
- HDOJ-3849(无向图桥)
- hdoj 4738 tarjan求无向图的桥
- HDOJ 4738 - Caocao's Bridges 用tarjan找无向图的桥..注意trick
- (精)hdoj 2544(最短路,地杰斯特拉算法)(无向图)
- HDOJ-1272(判断无向图是不是树,BFS || 并查集)
- HDOJ 3491 - Thieves 裸无向图的最小点权割...
- 求桥(无向图)
- Tyvj(无向图的桥)
- 无向图的桥
- 邻接矩阵(无向图)
- 无向图(Undigraph)
- hdoj 4612 Warm up 【无向图边双连通求桥数 缩点后求树的直径 桥数-树的直径】
- hdu 3849 求无向图的桥
- VUA 796 (无向图 求桥)
- hdoj 3849 By Recognizing These Guys, We Find Social Networks Useful 【无向图求桥】
- HDOJ 1878 - 欧拉回路 判断无向图是否是欧拉图...
- hdoj 4738 Caocao's Bridges 【无向图边-双联通 求所有桥中权值最小的】
- HDOJ 题目1878欧拉回路(无向图欧拉回路)
- ssh: connect to host github.com port 22: Connection refused
- 【HDU】1384 Intervals 差分约束系统
- //输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符//
- HDU 1061 Rightmost Digit 数论
- android开发笔记之SharedPreferences的使用
- HDOJ-3849(无向图桥)
- chrome组件开发--填表组件简单例子
- Populating Next Right Pointers in Each Node
- HDU 2035 人见人爱A^B
- Hibernate学习_005_Hibernate 中关于SessionFactory、Session接口的理解
- 合并排序的c语言实现
- 产品与项目
- Matrix multiplication
- Balanced Binary Tree