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
| #include <iostream> #include <algorithm> #include <queue> #include <utility> #include <cstring> #include <stack> #include <vector> using namespace std; const int N=152,M=5003; int head[N],nxt[M],to[M],num=0; void add(int a,int b){ num++; to[num]=b; nxt[num]=head[a]; head[a]=num; } int dfn[N],low[N],cnt=0; vector<pair<int,int>>ve; void tarjan(int x,int f){ dfn[x]=low[x]=++cnt; for(int i=head[x];i;i=nxt[i]){ int v=to[i]; if(v==f) continue; if(!dfn[v]){ tarjan(v,x); low[x]=min(low[x],low[v]); if(low[v]>dfn[x]){ ve.push_back(make_pair(x,v)); } }else{ low[x]=min(low[x],dfn[v]); } } } int main() { int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; add(u,v); add(v,u); } for(int i=1;i<=n;i++){ if(!dfn[i]) tarjan(i,0); } sort(ve.begin(),ve.end()); for(auto i:ve){ cout<<min(i.first,i.second)<<" "<<max(i.first,i.second)<<endl; } return 0; }
|