关于欧拉回路的疑问
  • 板块学术版
  • 楼主pengyule
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/12/20 14:44
  • 上次更新2023/11/5 05:53:01
查看原帖
关于欧拉回路的疑问
300078
pengyule楼主2020/12/20 14:44

很多人问过类似的问题,就是关于怎样是最后的字典序最小。但是貌似没有人像我这样写。我觉得是对的啊,思路就是当这条路走得通的时候再把它记录下来。 代码: 核心是这一块:

bool dfs(int x){//sum代表当前走了几条边
    if(sum==m) return 1;
	for(int i=1;i<='z'-'A'+1;i++)
		if(book[x][i]){
			book[x][i]=book[i][x]=0;
			sum++;
			s[++top]=i;
			if(dfs(i)) return 1;
			sum--;
			top--;
		}
	return 0;
}

输出:

	    cout<<char(target+'A'-1);
		for(int j=1;j<=top;j++) cout<<char(s[j]+'A'-1);

完整code:

#include <bits/stdc++.h>
using namespace std;
bool book[501][501];
int s[505],top,deg[101];
int sum;
int m,u,v,target,cnt;
bool dfs(int x){
    if(sum==m) return 1;
	for(int i=1;i<='z'-'A'+1;i++)
		if(book[x][i]){
			book[x][i]=book[i][x]=0;
			sum++;
			s[++top]=i;
			if(dfs(i)) return 1;
			sum--;
			top--;
		}
	return 0;
}
int main()
{
	cin>>m;
	char u0,v0;
	for(int i=1;i<=m;i++){
		cin>>u0>>v0; u=u0-'A'+1,v=v0-'A'+1;
		book[u][v]=book[v][u]=1;
		deg[u]++,deg[v]++;
	}
	for(int i=1;i<='z'-'A'+1;i++)
	    if(deg[i]%2) {
	        cnt++;
	        if(!target) target=i;
	    }
	if(cnt==0) for(int i=1;i<='z'-'A'+1;i++) if(deg[i]) { target=i; break; }
	if(cnt!=0 && cnt!=2) puts("No Solution");
	else {
		dfs(target);
	    cout<<char(target+'A'-1);
		for(int j=1;j<=top;j++) cout<<char(s[j]+'A'-1);
	}
	return 0;
}//对应题目是P1341,得分50pts

这样写就对了:

void dfs(int x){
	for(int i=1;i<='z'-'A'+1;i++)
		if(book[x][i]){
			book[x][i]=book[i][x]=0;
			dfs(i);
		}
	s[++top]=x;
}
for(int j=top;j>=1;j--) cout<<char(s[j]+'A'-1);

占用大家时间了,不好意思,希望大家能教一教我!

2020/12/20 14:44
加载中...