P5022 [NOIP2018 提高组] 旅行

 

 

 

::: 主程序要简洁 有些变量 可以放在 子程序

:::双向边-> faa 有环-> vis or TLE

:::顺序不可以错 cnt<n 一定 有误 因为是基环树 所以可能 删去了 数枝边

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=5e3+10;

vector<int> a[maxn];
int ans[maxn],cnt,vis[maxn],n,m,frr[maxn],too[maxn],res[maxn];

void dfs1(int x,int faa)
{
    //vis[x]=1;
    for(int i=0;i<a[x].size();i++)
    {
        int v=a[x][i];if(v==faa) continue;
        ans[++cnt]=v;
        dfs1(v,x);
    }
}
void dfs2(int x,int faa,int from,int to)
{
    if(vis[x]) return; vis[x]=1; res[++cnt]=x;
    for(int i=0;i<a[x].size();i++)
    {
        int v=a[x][i];if(v==faa) continue;
        if((x==from&&v==to)||(x==to&&v==from)) continue;
    //    res[++cnt]=v;vis[v]=1;
        dfs2(v,x,from,to);
    }
}
/*
bool ok(int res[],int ans[]){
    for(int i=1;i<=n;i++){
        if(res[i]<ans[i]) return 1;
        else return 0;
    }
//    return 0;
}*/
/////!!!!!!!
int ok(int res[],int ans[]) {
    for(int i=1;i<=n;i++) {
        if(res[i]<ans[i])
            return 1;
        else if(res[i]>ans[i])
            return 0;
    }
    return 0;
}

void update(){
    for(int i=1;i<=n;i++) ans[i]=res[i];
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;cin>>u>>v;
        a[u].push_back(v);
        a[v].push_back(u);
        frr[i]=u,too[i]=v;
    }
    for(int i=1;i<=n;i++) sort(a[i].begin(),a[i].end());
    
    if(m==n-1){
        ans[++cnt]=1;
        dfs1(1,1);
        
        for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
        cout<<endl;
        return 0;
    }
    else{
        int flag=1;
        for(int i=1;i<=m;i++) {// 主程序要简洁 有些变量 可以放在 子程序 
            memset(vis,0,sizeof(vis));    cnt=0;//双向边-> faa 有环-> vis orTLE 
            
            dfs2(1,1,frr[i],too[i]);
            if(cnt<n)    continue ;//顺序不可以错 cnt<n 一定 有误 因为可能 删去了 数枝边 
            if(flag) update(),flag=0;
            if(ok(res,ans)) update();
        }
        for(int i=1;i<=n;i++) {
            printf("%d ",ans[i]);
        }
    
    }
    
    return 0;
}
View Code

 

 
posted @ 2023-08-16 14:31  JMXZ  阅读(18)  评论(0)    收藏  举报