pts55求调欧拉路
查看原帖
pts55求调欧拉路
1104479
zombiell810975楼主2024/7/18 21:28

很朴素的代码。。。

#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
	return a<b;
}
struct word_edge{
	int to;
	string word;
};
vector<word_edge> g[27];
vector<bool>mar[27];
int n,du[27][2],t1;
string a[1003];
queue<string> _out;
void dfs(int x,int u){
	if(u==n){
		while(!_out.empty()) {
			cout<<_out.front();
			if(_out.size()>1) cout<<".";
			_out.pop();
		}
		exit(0);
	}//找到欧拉路并输出 
	for(int i=0;i<g[x].size();i++){
		if(!mar[x][i]) {
			mar[x][i]=1;
			_out.push(g[x][i].word);
			dfs(g[x][i].to,u+1);
			_out.pop();
			mar[x][i]=0;
		}
	}//dfs求解 
} 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		int st=int(a[i][0]-'a'+1),en=int(a[i][a[i].length()-1]-'a'+1);
		word_edge t;
		t.to=en;	
		t.word=a[i];
		g[st].push_back(t);
		mar[st].push_back(0);
		du[st][0]++;
		du[en][1]++;
	}
	int s=0,t=0,s1=0,sum=0;
	for(int i=1;i<=26;i++){
	//	if(du[i][0]!=0||du[i][1]!=0) printf("%c 出:%d 入:%d\n",char(i+'a'-1),du[i][0],du[i][1]); 
		if(du[i][0]-du[i][1]==1) {
			s++;
			s1=i;
		}
		if(du[i][1]-du[i][0]==1) {
			t++;
			t1=i;
		}
		if(du[i][0]==du[i][1]) sum++;
	}//找起点并判断欧拉路 
	if((s==1&&t==1&&sum+t+s==26)||(sum==26)){
		if(s1==0) {
			for(int i=1;i<=26;i++){
				if(du[i][0]!=0) {
					s1=i;
					break;
				}
			}
		}//回路情况找起点 
		dfs(s1,0);
	}
	printf("***");
	return 0;
}
2024/7/18 21:28
加载中...