#include <bits/stdc++.h>
using namespace std;
const int k_M = 6e6 + 3;
const int k_N = 1e5 + 3;
const int k_LOG_N = 20;
int n, m;
vector<int> adj[k_N];
vector<pair<int, int>> edges;
int p[k_N], sz[k_N], root[k_N], suffix[k_N];
int up[k_LOG_N][k_N], d[k_N];
bool not_critical[k_N];
int find_p(int x){
if(x == p[x]) return x;
return p[x] = find_p(p[x]);
}
int dfs(int x, int parent = -1){
int sum = 0;
for(int i = 0; i < adj[x].size(); ++i){
int to = (edges[adj[x][i]].first == x) ? edges[adj[x][i]].second : edges[adj[x][i]].first;
if(to == parent) continue;
int curr = dfs(to, x);
if(curr) not_critical[adj[x][i]] = true;
sum += curr;
}
return sum += suffix[x];
}
void dfs_join(int x, int parent){
up[0][x] = parent;
d[x] = d[parent] + 1;
for(int i = 1; i < k_LOG_N; ++i)
up[i][x] = up[i - 1][up[i - 1][x]];
for(const int &idx: adj[x]){
int to = (edges[idx].first == x) ? edges[idx].second : edges[idx].first;
if(to == parent) continue;
dfs_join(to, x);
}
}
bool unite(int x, int y){
if(find_p(x) == find_p(y)) return false;
if(sz[p[x]] < sz[p[y]]) swap(x, y);
dfs(root[p[y]]);
dfs_join(y, x);
sz[p[x]] += sz[p[y]];
p[p[y]] = p[x];
return true;
}
int get_lca(int u, int v){
if(d[u] < d[v]) swap(u, v);
int diff = d[u] - d[v];
if(diff){
for(int i = k_LOG_N - 1; i >= 0; --i){
if(diff & (1 << i)){
u = up[i][u];
}
}
}
if(u == v) return u;
for(int i = k_LOG_N - 1; i >= 0; --i){
if(up[i][u] != up[i][v]){
u = up[i][u];
v = up[i][v];
}
}
return up[0][u];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout << (sizeof(up) + sizeof(p) + sizeof(sz) + sizeof(suffix) + sizeof(root) + sizeof(not_critical) + sizeof(adj) + sizeof(edges) + 4 * sizeof(int) * k_N + 7 * sizeof(int) * k_N) / 1024 / 1024 << endl;
cin >> n >> m;
for(int i = 1; i <= n; ++i){
p[i] = i;
sz[i] = 1;
root[i] = i;
suffix[i] = 0;
d[i] = 0;
//for(int j = 0; j < k_LOG_N; ++j)
// up[j][i] = i;
}
for(int i = 0; i < m; ++i){
int u, v;
cin >> u >> v;
if(unite(u, v)){
edges.push_back({u, v});
adj[u].push_back(edges.size() - 1);
adj[v].push_back(edges.size() - 1);
}
else{
int lca = get_lca(u, v);
suffix[lca] -= 2;
suffix[u]++;
suffix[v]++;
}
}
for(int i = 1; i <= n; ++i)
if(i == find_p(i))
dfs(root[i]);
for(int i = 0; i < edges.size(); ++i)
if(!not_critical[i])
cout << edges[i].first << " " << edges[i].second << "\n";
}
Compilation message
pipes.cpp: In function 'int dfs(int, int)':
pipes.cpp:26:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < adj[x].size(); ++i){
~~^~~~~~~~~~~~~~~
pipes.cpp: In function 'int main()':
pipes.cpp:128:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < edges.size(); ++i)
~~^~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
2808 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
7 ms |
3584 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
203 ms |
8708 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
391 ms |
13796 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
690 ms |
22312 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1419 ms |
14180 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2416 ms |
15852 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3632 ms |
20652 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5034 ms |
24784 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5083 ms |
18948 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |