UVA 796 - Critical Links (求桥,模板题)
2015-07-07 17:25
381 查看
传送门:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737
题目大意:
给出多个连通的无向图(不止一个),求出各个连通图中的桥,并把所有按顺序输出,求出的桥的两个顶点也需按从小到大。
解题思路:
对每个点进行DFS搜索展开,运用定理low(v)>pre(u)求得各个连通图中的所有桥,放入一集合中并对集合排序并且判断重边即可。
最大的坑:格式,每个样例后要输出一空白行,特别是顶点数n=0的特例特判输出是最容易忘记输出空白行!
Code:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737
题目大意:
给出多个连通的无向图(不止一个),求出各个连通图中的桥,并把所有按顺序输出,求出的桥的两个顶点也需按从小到大。
解题思路:
对每个点进行DFS搜索展开,运用定理low(v)>pre(u)求得各个连通图中的所有桥,放入一集合中并对集合排序并且判断重边即可。
最大的坑:格式,每个样例后要输出一空白行,特别是顶点数n=0的特例特判输出是最容易忘记输出空白行!
Code:
/* W w w mm mm 222222222 7777777777777 */ /* W w w w m m m m 222 22 7777 */ /* w w w w m m m m 22 777 */ /* w w w w m m m m 22 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* ww ww m mm m 222222222222222 77 */ //#pragma comment(linker, "/STACK:102400000,102400000") //C++ //int size = 256 << 20; // 256MB //char *p = (char*)malloc(size) + size; //__asm__("movl %0, %%esp\n" :: "r"(p)); //G++ #include<set> #include<map> #include<queue> #include<stack> #include<ctime> #include<deque> #include<cmath> #include<vector> #include<string> #include<cctype> #include<cstdio> #include<cstdlib> #include<cstring> #include<sstream> #include<iostream> #include<algorithm> #define REP(i,s,t) for(int i=(s);i<=(t);i++) #define REP2(i,t,s) for(int i=(t);i>=s;i--) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned long ul; const int N=100005; int n; struct CountBridge { vector<int>G ; int low ,pre ; bool iscut ; int dfs_clock; vector<pair<int,int> >bri; void init() { REP(i,0,n-1) { G[i].clear(); } bri.clear(); memset(pre,0,sizeof(pre)); memset(iscut,false,sizeof(iscut)); dfs_clock=0; } void addedge(int u,int v) { G[u].push_back(v); G[v].push_back(u); } int dfs(int u,int fa) { int lowu=pre[u]=++dfs_clock; int child=0; for(int i=0; i<G[u].size(); i++) { int v=G[u][i]; if(!pre[v]) { child++; int lowv=dfs(v,u); lowu=min(lowu,lowv); if(lowv>=pre[u]) { iscut[u]=true; if(lowv>pre[u]) { if(u<v) { bri.push_back(make_pair(u,v)); } else { bri.push_back(make_pair(v,u)); } } } } else if(pre[v]<pre[u]&&v!=fa) { lowu=min(lowu,pre[v]); } } if(fa<0&&child==1) { iscut[u]=0; } low[u]=lowu; return lowu; } int solve() { REP(i,0,n-1) { if(!pre[i]) { dfs(i,-1); } } printf("%d critical links\n",bri.size()); sort(bri.begin(),bri.end()); vector<pair<int,int> >::iterator yy,it; yy=unique(bri.begin(),bri.end()); //for(int i=0; i<bri.size(); i++) { //printf("%d - %d\n",bri[i].first,bri[i].second); } for(it=bri.begin();it!=bri.end();it++) { printf("%d - %d\n",(*it).first,(*it).second); } printf("\n"); } void debug() { REP(i,0,n-1) { if(G[i].size()==0) { continue; } printf("%d ",i); for(int j=0; j<G[i].size(); j++) { printf(" %d",G[i][j]); } printf("\n"); } REP(i,0,n-1) { printf("low[%d]=%d\n",i,low[i]); } printf("dfs_clock=%d\n",dfs_clock); } } solver; int main() { #ifdef ONLINE_JUDGE #else freopen("test.in","r",stdin); #endif while(~scanf("%d",&n)) { if(n==0) { printf("0 critical links\n\n"); continue; } solver.init(); int u; REP(i,1,n) { int x; scanf("%d (%d)",&u,&x); REP(j,1,x) { int v; scanf("%d",&v); solver.addedge(u,v); } } solver.solve(); //solver.debug(); } return 0; }
相关文章推荐
- Android中ViewPager与HorizontalListView的滑动冲突处理
- iOS-ui-colorPicker
- HQL
- js拖动层原形版
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包
- Sharepoint2013 获取用户邮箱信息
- easyui-validatebox 验证
- Machine Learning课程 by Andrew Ng
- UISlider/滑块
- jni dev
- Java 异常+包+jar包
- 关注C-RAN 的五大理由
- python学习-循环线程
- Spring与RMI集成实现远程访问
- WCF - Overview
- (剑指Offer)面试题8:旋转数组的最小数字
- 如何判断微信内置浏览器
- 根据高级查询导出excel
- 记录一波三折的ViewPager与PagerAdapter
- 微信公众平台网页获取用户OpenID方法