:warning: graph_tree/lex_bfs.hpp

Code

vector<int> lex_bfs(graph g,int n,int m){
    list<list<int>>que;
    vector<list<list<int>>::iterator>pos1(n);
    vector<list<int>::iterator>pos2(n);
    list<int>s;
    rep(i,n)s.emplace_back(i);
    que.emplace_back(s);
    rep(i,n)pos1[i]=que.begin();
    {
        int idx=0;
        for(auto i=que.front().begin();i!=que.front().end();++i){
            pos2[idx++]=i;
        }
    }
    vector<int>used(n);
    vector<int>ans;
    while(!que.empty()){
        auto v=que.front().front();
        que.front().pop_front();
        if(que.front().empty())que.pop_front();
        ans.push_back(v);
        used[v]=1;
        for(auto e:g[v]){
            if(used[e])continue;
            if(pos1[e]==que.begin()||prev(pos1[e])->front()!=-1){
                que.insert(pos1[e],list<int>{-1});
            }
            prev(pos1[e])->push_back(e);
            auto tmp1=prev(pos1[e]);
            auto tmp2=prev(tmp1->end());
            pos1[e]->erase(pos2[e]);
            if(pos1[e]->empty())que.erase(pos1[e]);
            pos1[e]=tmp1;
            pos2[e]=tmp2;
        }
        for(auto e:g[v]){
            if(used[e])continue;
            if(pos1[e]->front()==-1){
                pos1[e]->pop_front();
            }
        }
    }
    return ans;
}
#line 1 "graph_tree/lex_bfs.hpp"
vector<int> lex_bfs(graph g,int n,int m){
    list<list<int>>que;
    vector<list<list<int>>::iterator>pos1(n);
    vector<list<int>::iterator>pos2(n);
    list<int>s;
    rep(i,n)s.emplace_back(i);
    que.emplace_back(s);
    rep(i,n)pos1[i]=que.begin();
    {
        int idx=0;
        for(auto i=que.front().begin();i!=que.front().end();++i){
            pos2[idx++]=i;
        }
    }
    vector<int>used(n);
    vector<int>ans;
    while(!que.empty()){
        auto v=que.front().front();
        que.front().pop_front();
        if(que.front().empty())que.pop_front();
        ans.push_back(v);
        used[v]=1;
        for(auto e:g[v]){
            if(used[e])continue;
            if(pos1[e]==que.begin()||prev(pos1[e])->front()!=-1){
                que.insert(pos1[e],list<int>{-1});
            }
            prev(pos1[e])->push_back(e);
            auto tmp1=prev(pos1[e]);
            auto tmp2=prev(tmp1->end());
            pos1[e]->erase(pos2[e]);
            if(pos1[e]->empty())que.erase(pos1[e]);
            pos1[e]=tmp1;
            pos2[e]=tmp2;
        }
        for(auto e:g[v]){
            if(used[e])continue;
            if(pos1[e]->front()==-1){
                pos1[e]->pop_front();
            }
        }
    }
    return ans;
}
Back to top page