#include <queue> #include <vector> #include <cstdio> #include <algorithm> #define PC putchar# Define GC GetChar () #define REP (a,b,c) for (int a = B;a <= c;++ a) #define per (A,B,C) for (int a = B;a >= c;--a) Inli NE int read () {int x = 0,f = 1; char C = GC; while (C < ' 0 ' | | c > ' 9 ') C = GC; while (c <= ' 9 ' && C >= ' 0 ') x = x * ten + C-' 0 ', C = GC; return x * f;} void print (int x) {if (x < 0) {PC ('-'); x =-X.; } if (x >=) print (X/10); PC (x 10 + ' 0 '); } const int MAXN = 100007; int A[MAXN << 1]; struct node {int v,next; BOOL Cut; } EDGE[MAXN << 1]; int head[maxn],num = 1; inline void Add_edge (int u,int v) {edge[++ num].v = v; edge[num].next = head[u];head[u] = num; e[num].cut = 0;} BOOL VIS[MAXN]; void Tarjan (int x,int fa) {low[x] = dfn[x] = + + index; stk[++ top] = x; VIS[X] = 1; for (int i = Head[x];i;i = edge[i].next) {int v = edge[I].V; if (v = = FA) continue; if (!dfn[v]) {Tarjan (v,x); LOW[X] = Std::min (Low[x],low[v]); if (Low[v] > Dfn[u]) {bridge + +; Edge[i].cut = true; edge[i ^ 1].cut = true; }} else if (Vis[v] && low[u] > Dfn[v]) low[u] = Dfn[v]; } if (dfn[x] = = Low[x]) {} void Solve () {n = read (); m = read (); for (int u,v,i = 1;i <= m;++ i) {u = read (), V = read (); Add_edge (U,V); Add_edge (V,u); } memset (dfn,0,sizeof DFN); top = block = Index = Bridge = 0; for (int i = 1;i <= n;++ i) if (!dfn[i]) Tarjan (i,i); } int main () {int t = read (); for (int i = 1;i <= t;++ i) {memset (head,0,szieof head); num = 0; Solve (); } }
Code--tmp