zoj 2588 Burning Bridges(求割边+对重边的处理)
2015-07-15 18:55
309 查看
题目链接:
点击打开链接
题目大意:
求出割边的数目和编号
题目分析:
模板题,注意对重边的处理即可
代码如下:
点击打开链接
题目大意:
求出割边的数目和编号
题目分析:
模板题,注意对重边的处理即可
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #define N 10007 #define M 100007 using namespace std; struct Edge { int v,next,id,tag; }e[M<<2]; int cc,head ; void add ( int u , int v , int id ) { int i; for ( i = head[u] ; ~i ; i = e[i].next ) if ( e[i].v == v ) break; if ( ~i ) { e[i].tag = 1; e[i].tag = 1; return; } e[cc].v = v; e[cc].next = head[u]; e[cc].id = id; e[cc].tag = 0; head[u] = cc++; } vector<int> ans; int dfn ,low ,times; void tarjan ( int u , int p ) { dfn[u] = low[u] = ++times; for ( int i = head[u] ; ~i ; i = e[i].next ) { int v = e[i].v; if ( !dfn[v] ) { tarjan(v,u); low[u] = min ( low[u] , low[v] ); if ( low[v] > dfn[u] && !e[i].tag ) ans.push_back ( e[i].id ); } else if ( v != p ) low[u] = min ( low[u] , dfn[v] ); } } int t,n,m,u,v; int main () { scanf ( "%d" , &t ); while ( t-- ) { ans.clear(); cc = times = 0; memset ( head , -1, sizeof(head)); memset ( dfn , 0 , sizeof ( dfn )); scanf ( "%d%d" , &n , &m ); for ( int i = 1 ; i <= m ; i++ ) { scanf ( "%d%d" , &u , &v ); add ( u , v , i ); add ( v , u , i ); } for ( int i = 1 ; i <= n ; i++ ) if ( !dfn[i] ) tarjan(i,-1); printf ( "%d\n" , ans.size()); if ( ans.size()) { sort ( ans.begin() , ans.end()); printf ( "%d" , ans[0] ); for ( int i = 1 ; i < ans.size() ; i++ ) printf ( " %d" , ans[i] ); puts(""); } if (t) puts(""); } }
相关文章推荐
- android 视图getParent,getChildAt
- VS2012 + SWIG Python
- 数据库查询并存放
- 困扰已久——DataGridView控件填充数据时自动添加列
- 冒泡选择
- 【R】shiny界面
- codeforces 463c
- 第八章的作业--8.15
- android studio 更新 Gradle错误解决方法
- iOS开发---绘图
- 变量和运算符的使用、JAVA控制语句
- HDU-1166-敌兵布阵-单点更新
- 长期坚持早起后,有哪些惊人的变化?
- python字符串/元组/列表/字典互转
- c++三种野指针
- centos 6.5安装vncserver 并开启远程桌面
- LeetCode---(106)Construct Binary Tree from Inorder and Postorder Traversal
- ArrayAdapter中的android.R.id.text1是什么
- 关于中文乱码问题
- 辗转到了Android