1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
   | #include<bits/stdc++.h> using namespace std; int n,m,q; int u[100001]; int v[100001]; bool b[100001]; int d[10001]; int nxt[100001]; int dfn[10001]; int low[10001]; int pre[10001][14]; int depth[10001]; int tot=1; inline void add(int x,int y) { 	u[++tot]=x; 	v[tot]=y; 	nxt[tot]=d[x]; 	d[x]=tot; 	return ; } int num; int cnt; int group[10001]; inline void tarjan(int now,int last) { 	dfn[now]=low[now]=++num; 	for(int i=d[now];i;i=nxt[i]) 	{ 		if(!dfn[v[i]]) 		{ 			tarjan(v[i],now); 			low[now]=min(low[now],low[v[i]]); 			if(low[v[i]]>dfn[now]) 			{ 				b[i]=b[i^1]=1; 			} 		} 		else if(dfn[v[i]]<dfn[now]&&v[i]!=last) 		{ 			low[now]=min(low[now],dfn[v[i]]); 		} 	} 	return ; } inline void color(int now,int type) { 	group[now]=type; 	for(int i=d[now];i;i=nxt[i]) 	{ 		if(!group[v[i]]&&(!b[i])) 		{ 			color(v[i],type); 		} 	} 	return ; } int main() { 	cin>>n>>m; 	for(int i=1;i<=m;i++) 	{ 		int x,y; 		cin>>x>>y; 		add(x,y); 		add(y,x); 	} 	tarjan(1,0); 	for(int i=1;i<=n;i++) 	{ 		if(!group[i]) 		{ 			color(i,++cnt); 		} 	} 	tot=0; 	memset(d,0,sizeof(d)); 	for(int i=2;i<=2*m+1;i++) 	{ 		if(b[i]) 		{ 			add(group[u[i]],group[v[i]]); 		} 	} 	return 0; }
   |