社区讨论

我是女生刚学OI,88分最后三个点TLE,求助

P5022[NOIP 2018 提高组] 旅行参与者 9已保存回复 16

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
16 条
当前快照
1 份
快照标识符
@mi7wfmn7
此快照首次捕获于
2025/11/21 04:43
4 个月前
此快照最后确认于
2025/11/21 06:33
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define maxn (5000+50)
using namespace std;
int n,m,u[maxn],v[maxn];
int p[maxn],ans[maxn];
vector<int> g[maxn];
bool d[maxn][maxn],vis[maxn];

namespace Tree
{
    void dfs(int u,int f)
    {
        printf("%d ",u);
        for (int i=0;i<g[u].size();++i)
        {
            int v=g[u][i];
            if (v==f) continue;
            dfs(v,u);
        }
    }
    
    void solve()
    {
        dfs(1,0);
    }
}

namespace BCTree
{
    int cnt;
    
    void dfs(int u,int f)
    {
        vis[u]=1;
        p[++cnt]=u;
//		printf("%d ",u);
        for (int i=0;i<g[u].size();++i)
        {
            int v=g[u][i];
            if (v==f) continue;
            if (!d[u][v]) continue;
            if (vis[v]) continue;
            dfs(v,u);
        }
    }
    
    bool check()
    {
        for (int i=1;i<=n;++i)
            if (ans[i]>p[i])
                return true;
            else if (ans[i]<p[i])
                return false;
        return false;
    }
    
    void solve()
    {
        ans[1]=n+1;
        for (int i=1;i<=m;++i)
        {
            memset(vis,0,sizeof(vis));
//			printf("%d\n",i);
            cnt=0;
            d[u[i]][v[i]]=d[v[i]][u[i]]=0;
            dfs(1,0); // puts("");
//			for (int j=1;j<=n;++j) printf("%d ",ans[j]);
//			puts("\n");
//			printf("%d\n",i);
            if (cnt==n && check())
                for (int j=1;j<=n;++j)
                    ans[j]=p[j];
            d[u[i]][v[i]]=d[v[i]][u[i]]=1;
        }
        for (int i=1;i<=n;++i)
            printf("%d ",ans[i]);
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;++i)
    {
        scanf("%d%d",&u[i],&v[i]);
        d[u[i]][v[i]]=d[v[i]][u[i]]=1;
        g[u[i]].push_back(v[i]);
        g[v[i]].push_back(u[i]);
    }
    for (int i=1;i<=n;++i) sort(g[i].begin(),g[i].end());
    
    if (m==n-1) Tree::solve();
    else if (m==n) BCTree::solve();
    
    return 0;
}

回复

16 条回复,欢迎继续交流。

正在加载回复...