pts45玄关求调
查看原帖
pts45玄关求调
1104479
zombiell810975楼主2024/7/18 20:35

欧拉路径 后6个点wa

#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];
string a[1003];
queue<string> _out;
void dfs(int x){
	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);
		}
	}
} 
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,t1=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);
		if(_out.size()!=n){
			printf("***");
			return 0; 
		}
		while(!_out.empty()) {
			cout<<_out.front();
			if(_out.size()>1) cout<<".";
			_out.pop();
		}
	}
	else printf("***");
	return 0;
}
2024/7/18 20:35
加载中...