제출 #546459

#제출 시각아이디문제언어결과실행 시간메모리
546459bluePipes (CEOI15_pipes)C++17
90 / 100
1097 ms21868 KiB
#include <iostream> #include <vector> using namespace std; const int mx = 100'000; int N, M; struct disjoint_set { int* parent = new int[1+mx]; int* subtree = new int[1+mx]; disjoint_set() { for(int i = 1; i <= mx; i++) { parent[i] = i; subtree[i] = 1; } } int root(int u) { if(parent[u] == u) return u; else return (parent[u] = root(parent[u])); } bool join(int u, int v) { u = root(u); v = root(v); if(u == v) return 0; if(subtree[u] < subtree[v]) swap(u, v); parent[v] = u; subtree[u] += subtree[v]; return 1; } }; int* lowlink; int* dfsind; int dfscurr; int* paredge; int* degree; int* edgelist[1+mx]; int* eu; int* ev; void dfs(int u) { // cerr << "dfs " << u << '\n'; // cerr << "paredge = "; // for(int i = 1; i <= N; i++) cerr << paredge[i] << ' '; // cerr << '\n'; dfsind[u] = ++dfscurr; for(int h = 0; h < degree[u]; h++) { int e = edgelist[u][h]; if(e == paredge[u]) continue; int v = eu[e] + ev[e] - u; if(dfsind[v] == 0) { // cerr << "edge " << u << " -> " << v << '\n'; paredge[v] = e; dfs(v); lowlink[u] = min(lowlink[u], lowlink[v]); } else { lowlink[u] = min(lowlink[u], dfsind[v]); } } // cerr << "dfs end " << u << " : " << lowlink[u] << ' ' << dfsind[u] << '\n'; // cerr << "paredge = "; // for(int i = 1; i <= N; i++) cerr << paredge[i] << ' '; // cerr << '\n'; if(lowlink[u] >= dfsind[u] && paredge[u] != 0) { // cerr << "\n\n"; // cerr << "paredge " << u << " = " << paredge[u] << '\n'; // cerr << "bridge detected : "; cout << eu[paredge[u]] << ' ' << ev[paredge[u]] << '\n'; // cerr << "\n\n"; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N >> M; disjoint_set A; disjoint_set B; int ect = 0; eu = new int[2*N + 1]; ev = new int[2*N + 1]; for(int e = 1; e <= M; e++) { int u, v; cin >> u >> v; if(A.join(u, v)) { ect++; eu[ect] = u; ev[ect] = v; } else if(B.join(u, v)) { ect++; eu[ect] = u; ev[ect] = v; } } delete[] A.parent; delete[] A.subtree; delete[] B.parent; delete[] B.subtree; degree = new int[1+N]; for(int i = 1; i <= N; i++) degree[i] = 0; for(int e = 1; e <= ect; e++) { degree[eu[e]]++; degree[ev[e]]++; } for(int i = 1; i <= N; i++) { edgelist[i] = new int[degree[i]]; } // delete[] degree; int currind[1+N]; for(int i = 1; i <= N; i++) currind[i] = -1; // cerr << "done\n"; for(int e = 1; e <= ect; e++) { currind[eu[e]]++; currind[ev[e]]++; // cerr << currind[eu[e]] << ' ' << degree[eu[e]] << '\n'; // cerr << currind[ev[e]] << ' ' << degree[ev[e]] << '\n'; edgelist[eu[e]][currind[eu[e]]] = e; edgelist[ev[e]][currind[ev[e]]] = e; } // cerr << "\n\n\n\n"; paredge = new int[1+N]; lowlink = new int[1+N]; dfsind = new int[1+N]; for(int i = 1; i <= N; i++) { lowlink[i] = 1'000'000; dfsind[i] = 0; paredge[i] = 0; } dfscurr = 0; for(int i = 1; i <= N; i++) { if(dfsind[i]) continue; dfs(i); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...