两年了,还是76pts(呜呜)
查看原帖
两年了,还是76pts(呜呜)
101694
yummyeaten楼主2021/11/15 19:29
#include<bits/stdc++.h>
using namespace std;
int n,m;
bool vis[500005],on[500005];
vector<int> g[500005];
void tree(int rt,int fa)
{
    printf("%d ",rt);
    sort(g[rt].begin(),g[rt].end());
    for(int i:g[rt])
        if(i!=fa)tree(i,rt);
}
int getring(int rt,int fa)
{
    vis[rt]=1;
    sort(g[rt].begin(),g[rt].end());
    for(auto i=g[rt].begin();i!=g[rt].end();i++)
    {
        if(*i==fa)continue;
        if(vis[*i])
        {
            on[rt]=1;
            return *i;
        }
        int tmp=getring(*i,rt);
        if(tmp==0)continue;
        on[rt]=1;
        if(rt==tmp)return 0;
        return tmp;
    }
    return 0;
}
void deledge(int x,auto i)
{
    g[*i].erase(lower_bound(g[*i].begin(),g[*i].end(),x));
    g[x].erase(i);
}
bool flag=0;
void ring(int rt,int fa,int cmn)
{
    vis[rt]=1;printf("%d ",rt,fa,cmn);
    for(auto i=g[rt].begin();i!=g[rt].end();i++)
    {
        if(*i==fa)continue;
        if(vis[*i])
        {
            flag=1;
            deledge(rt,i);
            i--;continue;
        }
        if((i==g[rt].end()-1 || i==g[rt].end()-2 && *(i+1)==fa) && *i>cmn && flag==0 && on[rt] && on[*i])
        {
            flag=1;
            deledge(rt,i);
            return;
        }
        if(i==g[rt].end()-1)
            ring(*i,rt,cmn);
        else if(*(i+1)==fa)
        {
            if(i+2==g[rt].end())
                ring(*i,rt,cmn);
            else
                ring(*i,rt,*(i+2));
        }
        else
            ring(*i,rt,*(i+1));
    }
}
int main()
{
    int u,v;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    if(m<n){tree(1,0);return 0;}
    getring(1,0);
    memset(vis,0,sizeof(vis));
    ring(1,0,n+1);
    return 0;
}
2021/11/15 19:29
加载中...