luogu P1127 词链题解

本蒟蒻今天写了一题P1127 词链题解发现这题十分に素晴らしい。(十分的奇妙)
别的欧拉路径题都是直接输入边,这题要把字符串当做边(首字母为起点,尾字母为终点,26英文字母为节点)

大部分人都是这样的把但不是的
其他都与普通一致代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=1100;
int m;
string words[N];
vector<int> graph[26];
vector<int> used_edge;
int in_deg[N],out_deg[N];
int h[N];
bool cmp(int &a,int &b){
	return words[a]<words[b];
}
void dfs(int x){
	while(h[x]<graph[x].size()){
		int now=h[x];
		h[x]++;
		int edge_id=graph[x][now];
		int to=words[edge_id].back()-'a';
		dfs(to);
		used_edge.push_back(edge_id);
	}
}
int main(){
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>words[i];
		int start=words[i].front()-'a',end=words[i].back()-'a';
		graph[start].push_back(i);
		out_deg[start]++; in_deg[end]++;
	}
	for(int i=0;i<26;i++){
//		sort(graph[i].begin(),graph[i].end,[&](int a,int b){return words[a]<words[b]; });
		sort(graph[i].begin(),graph[i].end(),cmp);
	}
	int start_p=-1,end_p=-1,cnt_s=0,cnt_e=0;
	bool ok=1;
	for(int i=0;i<26;i++){
		int deg=out_deg[i]-in_deg[i];
		if(deg==1){
			cnt_s++;
			if(start_p==-1)
				start_p=i;
			else
				ok=0; 
		}
		else if(deg==-1){
			cnt_e++;
			if(end_p==-1)
				end_p=i;
			else
				ok=0;
		}
		else if(deg!=0){	
			ok=0;
		}
	}
	if(!ok){
		puts("***");
		return 0;
	}
	if(start_p==-1){
		for(int i=0;i<26;i++){
			if(in_deg[i]>0){
				start_p=i;
				break;
			}
		}
	}
	dfs(start_p);
	reverse(used_edge.begin(),used_edge.end());
	if(used_edge.size()!=m){
		puts("***");
		return 0;
	}
	for(int i=0;i<used_edge.size();i++){
		int id=used_edge[i];
		cout<<words[id];
		if(i!=used_edge.size()-1){
			cout<<'.';
		}
	}
	cout<<'\n';
    return 0;
}
posted @ 2025-04-27 20:48  linyide  阅读(3)  评论(0)    收藏  举报