Submission #503882

#TimeUsernameProblemLanguageResultExecution timeMemory
503882CraniXortPipes (CEOI15_pipes)C++17
40 / 100
967 ms65536 KiB
#include <bits/stdc++.h> #define maxn 100005 #define fin std::cin #define fout std::cout // std::ifstream fin("pipes.in"); // std::ofstream fout("pipes.out"); std::vector <int> edge[maxn]; int disc[maxn], low[maxn], timer; bool visited[maxn]; void dfs(int node, int parent) { visited[node] = true; disc[node] = low[node] = ++timer; bool ok = false; for(auto next: edge[node]) { if(next == parent and ok == false) { ok = true; continue; } if(visited[next] == false) { dfs(next, node); low[node] = std::min(low[node], low[next]); if(low[next] > disc[node]) { fout << node << ' ' << next << '\n'; } } else{ low[node] = std::min(low[node], disc[next]); } } } class DSU { int size; std::vector <int> rank, parent; public: DSU(int size): size(size) { rank.resize(size+1); parent.resize(size+1); for(int i = 1; i <= size; i ++) parent[i] = i; } int findRoot(int node) { if(parent[node] == node) return node; return parent[node] = findRoot(parent[node]); } void combine(int node1, int node2) { node1 = findRoot(node1); node2 = findRoot(node2); if(node1 == node2) return; if(rank[node1] < rank[node2]) std::swap(node1, node2); parent[node2] = node1; if(rank[node1] == rank[node2]) rank[node1] ++; } bool sameComponent(int node1, int node2) { node1 = findRoot(node1); node2 = findRoot(node2); return node1 == node2; } }; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); int V, E; fin >> V >> E; DSU first(V), second(V); for(int i = 0, src, dest; i < E; i ++) { fin >> src >> dest; if(first.sameComponent(src, dest) == false) { edge[src].push_back(dest); edge[dest].push_back(src); first.combine(src, dest); } else if(second.sameComponent(src, dest) == false) { edge[src].push_back(dest); edge[dest].push_back(src); second.combine(src, dest); } } for(int i = 1; i <= V; i ++) if(visited[i] == false) dfs(i, -1); return 0; }
#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...