#include <bits/stdc++.h> using namespace std; const int mxN = 1e3; int n, m, timer, tin[mxN], low[mxN], c[mxN]; vector<int> adj[mxN]; vector<array<int, 2>> ans; void dfs(int u, int pu=-1){
c[u] = 0; tin[u] = low[u] = timer++; int children = 0; for(int v : adj[u]){ if(c[v] == 0){ // a back-edge; ans.push_back({u+1, v+1}); low[u] = min(low[u], tin[v]); } else if(c[v] == -1){ // a tree-edge; ans.push_back({u+1, v+1}); dfs(v, u); low[u] = min(low[u], low[v]); children++; if(low[v] > tin[u]){ // a bridge; ans.push_back({v+1, u+1}); } } } c[u] = 1; } void init(){ timer = 0; memset(c, -1, sizeof(c)); memset(tin, -1, sizeof(tin)); memset(low, -1, sizeof(low)); ans.clear(); for(int i = 0; i < n; i++){ adj[i].clear(); } } int main() {
ofstream fout("out"); int __case = 1; while(scanf("%d %d", &n, &m) &&(n&&m)){ init(); for(int i = 0, u, v; i < m; i++){ cin >> u >> v, u--, v--; adj[u].emplace_back(v); adj[v].emplace_back(u); } for(int i = 0; i < n; i++){ if(c[i] == -1){ dfs(i); } } cout << __case++ << "\n\n"; for(array<int, 2> a : ans){ cout << a[0] << ' ' << a[1] << '\n'; } cout << "#\n";
} return 0; }
No comments:
Post a Comment