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;
}