加强版数据过了然后标准版的WA了3个点(怎么回事)
查看原帖
加强版数据过了然后标准版的WA了3个点(怎么回事)
456675
a_sad_soul楼主2023/10/12 15:50
#include<bits/stdc++.h>
#define MAXN 500005
using namespace std;
vector<int>e[MAXN];
bool InCircle[MAXN];
void add(int u,int v)
{
    e[u].push_back(v);
    e[v].push_back(u);
}
int n,m;
bool cmp(int a,int b){return a<b;}
int ans[MAXN];
int tot;
bool vis[MAXN];
void nocircle(int u,int l,int r){
    vis[u]=1;
    ans[++tot]=u;
    for(int i=0;i<e[u].size();++i)
    {
        if((u==l&&e[u][i]==r)||(u==r&&e[u][i]==l)||vis[e[u][i]])continue;
        nocircle(e[u][i],l,r);
    }
}
int last[MAXN];
bool Success;

void getcircle(int u,int fa){
    last[u]=fa;
    for(int i=0;i<e[u].size()&&!Success;++i)
    {
        int v=e[u][i];
        if(v==fa)continue;
        if(last[v])
        {
            last[v]=u;
            for(int j=u;j>0;j=last[j])
            {
                InCircle[j]=true;
                if(j==v)break;
            }
            Success=true;
            return ;
        }
        getcircle(v,u);
    }
}

int findin=-1;
bool SuccessRe;
int La=0x7fffffff;
void dfs(int u)
{
    ans[++tot]=u;
    vis[u]=1;
    bool re=0;
    if(InCircle[u]&&!SuccessRe)
    {
        for(int i=0;i<e[u].size();++i)
        {
            int v=e[u][i];
            if(vis[v])continue;
            if(InCircle[v])
            {
                int j=i+1;
                while(j<e[u].size()&&vis[e[u][j]])++j;
                if(j<e[u].size())La=e[u][j];
                else if(e[u][i]>La)
                {
                    re=true;
                    SuccessRe=true;
                    break;
                }
            }
        }
    }
    for(int i=0;i<e[u].size();++i)
    {
        int v=e[u][i];
        if(vis[v])continue;
        if(InCircle[v]&&re)continue;
        dfs(v);
    }
   /* for(int i=0;i<e[u].size();++i)
    {
        if(InCircle[e[u][i]])
        {
            if(i==e[u].size()-1)continue;
            if(La==-1)La=e[u][i+1];
            La=min(La,e[u][i+1]);
        }
    }
    for(int i=0;i<e[u].size();++i)
    {
        int v=e[u][i];
        if(vis[v]||(InCircle[v]&&v>La&&La!=-1))continue;
        dfs(v);
    }

    return ;*/
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
    }
    
    for(int i=1;i<=n;++i)sort(e[i].begin(),e[i].end(),cmp);

    if(m+1==n){
    nocircle(1,-1,-1);
    for(int i=1;i<=n;++i)printf("%d ",ans[i]);
    }
    else
    {
        getcircle(1,1);
        dfs(1);
        
        for(int i=1;i<=n;++i)
            printf("%d ",ans[i]);
    }
    return 0;
}
2023/10/12 15:50
加载中...