//In The Name Of Allah
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define F first
#define S second
//#pragma GCC optimize("Ofast")
const int maxn = 1e5 + 5, maxlog = 19;
int n, m, pr[maxn], x, y, par[maxn][maxlog], h[maxn], cnt[maxn], cnt2[maxn], pr2[maxn];
bitset<maxn * 60> bs;
vector<int> adj[maxn];
vector<pair<int, int> > edge;
bool vis[maxn];
int getpar2(int v)
{
if(pr2[v] == 0)
return pr2[v] = v;
return (v == pr2[v] ? v : pr2[v] = getpar2(pr2[v]));
}
bool un2(int v, int u)
{
v = getpar2(v);
u = getpar2(u);
if(u != v)
{
pr2[u] = v;
return 1;
}
return 0;
}
int getpar(int v)
{
if(pr[v] == 0)
return pr[v] = v;
return (v == pr[v] ? v : pr[v] = getpar(pr[v]));
}
bool un(int v, int u)
{
v = getpar(v);
u = getpar(u);
if(u != v)
{
pr[u] = v;
return 1;
}
return 0;
}
void dfs(int v, int p = 0, int hi = 1)
{
vis[v] = 1;
par[v][0] = p;
h[v] = hi;
for(int i = 1; i < maxlog; i++)
par[v][i] = par[par[v][i - 1]][i - 1];
for(auto u : adj[v])
if(u != p)
dfs(u, v, hi + 1);
}
int lca(int v, int u)
{
if(h[v] < h[u])
swap(v, u);
for(int i = maxlog - 1; i >= 0; i--)
if(h[par[v][i]] >= h[u])
v = par[v][i];
for(int i = maxlog - 1; i >= 0; i--)
if(par[v][i] != par[u][i])
v = par[v][i], u = par[u][i];
return (v == u ? v : par[v][0]);
}
void dfs2(int v, int p = 0)
{
vis[v] = 1;
cnt2[v] = cnt[v];
for(auto u : adj[v])
if(u != p)
dfs2(u, v), cnt2[v] += cnt2[u];
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin >> n >> m;
for(int i = 0; i < m; i++)
{
cin >> x >> y;
if(un(x, y))
{
adj[x].pb(y);
adj[y].pb(x);
//bs[i] = 1;
}
else if(un2(x, y))
edge.pb({x, y});
}
for(int i = 1; i <= n; i++)
if(!vis[i])
dfs(i);
//cout << lca(1, 2) << '\n';
//cin.seekg(0);
//cin >> n >> m;
for(auto e : edge)
{
x = e.F, y = e.S;
//cin >> x >> y;
//cout << x << " " << y << '\n';
//cout << x << " " << y << '\n';
//cout << x << " " << y << " " << lca(x, y) << '\n';
cnt[x] ++;
cnt[y] ++;
cnt[lca(x, y)] -= 2;
}
//return 0;
memset(vis, 0, maxn);
for(int i = 1; i <= n; i++)
if(!vis[i])
dfs2(i);
vector<pair<int, int> > ans;
for(int i = 2; i <= n; i++)
if(cnt2[i] == 0&& par[i][0] != 0)
ans.pb({i, par[i][0]});
//cout << ans.size() << '\n';
for(auto a : ans)
cout << a.F << " " << a.S << '\n';
return 0;
}
/*
10 11
1 7
1 8
1 6
2 8
6 7
5 8
2 5
2 3
2 4
3 4
10 9
*/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
2764 KB |
Output is correct |
2 |
Correct |
2 ms |
2764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
3404 KB |
Output is correct |
2 |
Correct |
7 ms |
3404 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
112 ms |
3316 KB |
Output is correct |
2 |
Correct |
110 ms |
3908 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
189 ms |
4180 KB |
Output is correct |
2 |
Correct |
246 ms |
4820 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
346 ms |
5924 KB |
Output is correct |
2 |
Runtime error |
287 ms |
20456 KB |
Memory limit exceeded |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
467 ms |
12052 KB |
Output is correct |
2 |
Runtime error |
444 ms |
30184 KB |
Memory limit exceeded |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
709 ms |
13416 KB |
Output is correct |
2 |
Runtime error |
702 ms |
46332 KB |
Memory limit exceeded |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
920 ms |
15952 KB |
Output is correct |
2 |
Runtime error |
906 ms |
57376 KB |
Memory limit exceeded |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1139 ms |
16052 KB |
Output is correct |
2 |
Runtime error |
1130 ms |
65536 KB |
Memory limit exceeded |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1359 ms |
15196 KB |
Output is correct |
2 |
Runtime error |
1373 ms |
65536 KB |
Memory limit exceeded |