社区讨论
64分求助!!!代码可读性很高!> <
P5022[NOIP 2018 提高组] 旅行参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lr0bl166
- 此快照首次捕获于
- 2024/01/05 15:33 2 年前
- 此快照最后确认于
- 2024/01/05 19:56 2 年前
神犇奆佬们棒棒本蒟蒻把,不知道哪里错了
CPP#include <bits/stdc++.h>
using namespace std;
int n,m;
vector <int> mp[5010];
int ans[5010],ok[5010],t;
int cir[5010],du[5010],okk[5010],a[5010];
void dfs_tree (int x) // 遍历整棵树
{
a[++t]=x;
ok[x]=1;
if (mp[x].size()>1) sort(mp[x].begin(),mp[x].end());
for (int i=0;i<mp[x].size();i++)
if (ok[mp[x][i]]==0) dfs_tree(mp[x][i]);
}
void dfs (int x)
{
okk[x]++;
for (int i=0;i<mp[x].size();i++)
if (okk[mp[x][i]]==0) {
int kk=mp[x][i];
for (int j=0;j<mp[kk].size();j++)
if (mp[kk][j]==x) {
mp[kk].erase(mp[kk].begin()+j);
break;
}
mp[x].erase(mp[x].begin()+i); // 删边
t=0; // 初始化
for (int j=1;j<=n;j++) ok[j]=0;
dfs_tree(1);
// cout<<x<<"!!!"<<kk<<endl;
// for (int j=1;j<=n;j++) {
// cout<<j<<"! ";
// for (int kkk=0;kkk<mp[j].size();kkk++)
// cout<<mp[j][kkk]<<" ";
// cout<<endl;
// }
// cout<<endl;
// for (int j=1;j<=t;j++)
// cout<<a[j]<<" ";
// cout<<endl;
for (int j=1;j<=t;j++) // 找到最小的
if (ans[j]>a[i]) {
for (int kkk=1;kkk<=t;kkk++)
ans[kkk]=a[kkk];
break;
}
mp[x].push_back(kk); // 恢复边
mp[kk].push_back(x);
dfs(kk); // 删下一个环上的边
break;
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) {
int a,b;
scanf("%d%d",&a,&b);
mp[a].push_back(b); mp[b].push_back(a);
du[a]++; du[b]++;
}
if (m==n-1) {
dfs_tree(1);
for (int i=1;i<=t;i++)
cout<<a[i]<<" ";
return 0;
}
int k=1;
while (k) { // 删掉入度为1的边,剩个环
k=0;
for (int i=1;i<=n;i++) {
if (du[i]==1 && okk[i]==0) {
k=1;
du[i]--;
for (int j=0;j<mp[i].size();j++)
du[mp[i][j]]--;
okk[i]=1;
break;
}
}
}
ans[1]=0x3f3f3f3f;
for (int i=1;i<=n;i++)
if (okk[i]==0) { // 找个环开始遍历删边
okk[i]=-1;
dfs(i);
break;
}
for (int i=1;i<=n;i++)
cout<<ans[i]<<" ";
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...