这道题我本来不想写的,因为和前面的有道题一样的类型。
但是我为什么写这道题的原因是想提醒自己看清题目。
我又看错题了。。将点的数量看成了10^3,而却ZOJ这道题,数组开小了居然是TLE,目测跟内存的调用有关?不懂。所以,我就DEBUG了超久。细节决定成败啊。
题意:就是给你无向图,然后求出桥,输出他们的编号,注意有重边。
这道题都不需要缩点了,直接求出桥就可以了。
直接套用以前的模版就可以了。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2505 #define inf 1<<28 #define LL(x) ( x << 1 ) #define RR(x) ( x << 1 | 1 ) #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i ) #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define mp(a,b) make_pair(a,b) #define PII pair<int,int> using namespace std; inline void RD(int &ret) { char c; do { c = getchar(); } while(c < '0' || c > '9') ; ret = c - '0'; while((c=getchar()) >= '0' && c <= '9') ret = ret * 10 + ( c - '0' ); } inline void OT(int a) { if(a >= 10)OT(a / 10) ; putchar(a % 10 + '0') ; } #define N 200005 #define M 10005 struct edge { int e , next , id ; int sign ; } ed[N] ; int head[M] ,num ; int dfn[M] ,low[M] ,brg[N] ; int brgnum , top ,dp ; int n , m ; void add(int s ,int e ,int id) { ed[num].e = e ; ed[num].id = id ; ed[num].next = head[s] ; ed[num].sign = 0 ; head[s] = num ++ ; } void init() { mem(head, -1) ; num = 0 ; brgnum = 0 ; mem(dfn ,0) ; mem(low ,0) ; mem(brg ,0) ; top = dp = 0 ; } void tarjan(int now ,int fa) { dfn[now] = low[now] = ++ dp ; bool first = 0 ; for (int i = head[now] ; ~i ; i = ed[i].next ) { int e = ed[i].e ; if(ed[i].sign)continue ; ed[i].sign = ed[i ^ 1].sign = 1 ; if(!dfn[e]) { tarjan(e ,now) ; low[now] = min(low[now] ,low[e]) ; if(dfn[now] < low[e]) { brg[brgnum ++] = ed[i].id ; } } else low[now] = min(low[now] , dfn[e]) ; } } int main() { int T ; cin >> T ; int ss = 0 ; while( T -- ) { init() ; if(ss)puts("") ; ss ++ ; cin >> n >> m ; REP(i , 1 , m ) { int a , b ; scanf("%d%d",&a, &b) ; add(a , b , i) ; add(b , a , i) ; } REP(i , 1 , n ) { top = dp = 0 ; if(!dfn[i])tarjan(i ,-1) ; } sort(brg , brg + brgnum) ; printf("%d\n",brgnum) ; if(brgnum) { OT(brg[0]) ; REP(i , 1 , brgnum - 1)printf(" %d",brg[i]) ; puts("") ; } } return 0 ; }