This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define sz(v) (int)v.size()
struct back_edge{
int d, v, id;
bool operator<(const back_edge& b) const{
return d < b.d;
}
};
const int MAXN = 5*1e5+5;
vector< pair<int,int> > adj[MAXN];
set< back_edge > be[MAXN];
vector<int> cur;
int dist[MAXN], p[MAXN], marc[MAXN];
void dfsIni(int s){
for(int i = 0; i < sz(adj[s]); i++){
int viz = adj[s][i].fi, id = adj[s][i].sc;
if(viz != p[s]){
if(dist[viz]){
if(dist[viz] < dist[s]){
back_edge temp; temp.d = dist[viz]; temp.v = viz; temp.id = id;
be[s].insert(temp);
}
continue;
}
p[viz] = s;
dist[viz] = dist[s]+1;
dfsIni(viz);
}
}
}
void imprime(int a, int b){
while(a != b){
cout<<a<<" ";
a = p[a];
}
cout<<b<<" ";
}
void dfs(int s){
marc[s] = 1;
if(sz(be[s]) > 0){
auto it = be[s].begin();
vector< set<back_edge>::iterator > v;
while(it != be[s].end() && sz(cur) > 0){
int x = cur.back();
if(it->v == x){
v.push_back(it);
imprime(s,x);
cout<<"\n";
}else{
back_edge temp; temp.d = it->d; temp.v = 0; temp.id = 0;
auto it2 = be[x].lower_bound(temp);
if(it2 == be[x].end())break;
imprime(s,x);
imprime(it2->v,it->v);
cout<<"\n";
be[x].erase(it2);
if(sz(be[x]) == 0)cur.pop_back();
v.push_back(it);
}
it++;
}
for(auto it : v)be[s].erase(it);
}
if(sz(be[s]) > 0)cur.push_back(s);
for(int i = 0; i < sz(adj[s]); i++){
int viz = adj[s][i].fi, id = adj[s][i].sc;
if(!marc[viz])dfs(viz);
}
if(sz(cur) > 0 && cur.back() == s){
imprime(s,be[s].begin()->v);
cout<<"\n";
cur.pop_back();
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n,m; cin>>n>>m;
for(int i = 1; i <= m; i++){
int a,b; cin>>a>>b;
adj[a].emplace_back(b,i);
adj[b].emplace_back(a,i);
}
dist[1] = 1;
dfsIni(1);
dfs(1);
}
Compilation message (stderr)
postmen.cpp: In function 'void dfs(int)':
postmen.cpp:79:33: warning: unused variable 'id' [-Wunused-variable]
79 | int viz = adj[s][i].fi, id = adj[s][i].sc;
| ^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |