社区讨论
我是女生刚学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 条回复,欢迎继续交流。
正在加载回复...