ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P5022 旅行

2019-08-22 20:55:55  阅读:289  来源: 互联网

标签:旅行 5001 int dd ne bol 15000 P5022


 

——————————————————————————————————————————————————

给了最近怀疑码力的我一片希望,竟然一A了

(如果除去在loj上忘了加fre与在洛谷上忘了删fre)

暴力基环树,n^2logn

好吧当我没说,洛谷上MLE了

怎么这么毒瘤,空间这么小

————————————————————————————————————————————————

#include<bits/stdc++.h>
using namespace std;
int ne,a,b,n,m,head[15000],colar[15000],dd[15000][2],flg=0,tot=0,pos=1,tn=0;
int ans[5001],last[5001];
int ma[5001][5001],bol[5001][5001];
struct node{int to,nxt;}eg[15000];
void adde(int u,int v){eg[++ne].to=v;eg[ne].nxt=head[u];head[u]=ne;}
int cmp(int a,int b){return a<b;}
stack<int>st;
void dfs(int u,int fa)
{
    cout<<u<<" ";
    int cnt=0;
    for(int i=head[u];i;i=eg[i].nxt)if(eg[i].to!=fa)ma[u][++cnt]=eg[i].to;
    sort(ma[u]+1,ma[u]+1+cnt,cmp);
    for(int i=1;i<=cnt;i++)dfs(ma[u][i],u);
}
void dfs2(int u,int fa){
    if(flg)return;
    colar[u]=1;
    for(int i=head[u];i;i=eg[i].nxt)
    {
        int v=eg[i].to;
        if(v==fa)continue;
        if(!colar[v]){
        st.push(v);
        dfs2(v,u);    
        if(flg)return;
        st.pop();
        }
        else{
            dd[++tot][0]=u;
            dd[tot][1]=v;
            while(1)
            {
                int ta=st.top();
                if(ta==v){flg=1;return;}
                st.pop();
                dd[++tot][0]=ta;
                dd[tot][1]=st.top();
            }    
        }
    }
}
void dfs3(int u,int fa)
{
    last[++tn]=u;
    int cnt=0;
    for(int i=head[u];i;i=eg[i].nxt)if(eg[i].to!=fa&&(!bol[u][eg[i].to]))ma[u][++cnt]=eg[i].to;
    sort(ma[u]+1,ma[u]+1+cnt,cmp);
    for(int i=1;i<=cnt;i++)dfs3(ma[u][i],u);
}
void dfs4(int u,int fa)
{
    ans[++tn]=u;
    int cnt=0;
    for(int i=head[u];i;i=eg[i].nxt)if(eg[i].to!=fa&&(!bol[u][eg[i].to]))ma[u][++cnt]=eg[i].to;
    sort(ma[u]+1,ma[u]+1+cnt,cmp);
    for(int i=1;i<=cnt;i++)dfs4(ma[u][i],u);
}
int main()
{
    //freopen("travel.in","r",stdin);
    //freopen("travel.out","w",stdout);
    cin>>n>>m;for(int i=1;i<=m;i++)
    {cin>>a>>b;adde(a,b);adde(b,a);}
    if(m==n-1)dfs(1,0);
    else{
        st.push(1);
        dfs2(1,0);
        bol[dd[1][0]][dd[1][1]]=bol[dd[1][1]][dd[1][0]]=1;
        dfs3(1,0);
        bol[dd[1][0]][dd[1][1]]=bol[dd[1][1]][dd[1][0]]=0;
        for(pos=2;pos<=tot;pos++)
        {
            bol[dd[pos][0]][dd[pos][1]]=bol[dd[pos][1]][dd[pos][0]]=1;
                tn=0;
                dfs4(1,0);
                for(int i=1;i<=n;i++){
                    if(ans[i]>last[i])break;
                    if(ans[i]<last[i])
                {for(int j=1;j<=n;j++)last[j]=ans[j];break;}
                }
            bol[dd[pos][0]][dd[pos][1]]=bol[dd[pos][1]][dd[pos][0]]=0;
        }
        for(int i=1;i<=n;i++)cout<<last[i]<<" ";
    }
}

 

标签:旅行,5001,int,dd,ne,bol,15000,P5022
来源: https://www.cnblogs.com/SFWR-YOU/p/11396754.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有