社区讨论

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 条回复,欢迎继续交流。

正在加载回复...