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 87 88 89 90 91 92 93 94
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype> #include <array>
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; const ll MAXN=160; vector<ll> g[MAXN];
ll N,M; pll edge[5010];
ll dfsn[MAXN],low[MAXN];
ll fa[MAXN]; ll idx=0; bool vis[MAXN];
ll dfs(int x,int pa){ fa[x]=pa; vis[x]=true; dfsn[x]=++idx; low[x]=dfsn[x]; for(int i=0;i<g[x].size();++i){ if(!vis[g[x][i]]){ low[x]=min(dfs(g[x][i],x),low[x]); }else if(g[x][i] != pa ){ low[x]=min(dfsn[g[x][i]],low[x]); }else if(g[x][i+1]==pa){ low[x]=min(dfsn[g[x][i]],low[x]); } } return low[x]; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>M; for(int i=1;i<=M;++i){ cin>>edge[i].first>>edge[i].second; } sort(&edge[1], &edge[M+1]); for(int i=1;i<=M;++i){ g[edge[i].first].push_back(edge[i].second); g[edge[i].second].push_back(edge[i].first); } dfs(1,1); vector<pll> ans; for(int i=1;i<=N;++i){ if(low[i]>dfsn[fa[i]]){ ll a=fa[i],b=i; if(a>b) swap(a, b); ans.push_back({a,b}); } } sort(ans.begin(),ans.end()); for(int i=0;i<ans.size();++i){ cout<<ans[i].first<<' '<<ans[i].second<<'\n'; } return 0; }
|