题解:AT_icpc2012autumn_a Dictionary
题意
给定
解法
如果
用图论解决这个问题。
找到这个
那么建完图之后暴力枚举从某个字母是否有一条路径能回到它自己,如果有则无解。
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e2+5;
int n,e[26][26];
string a[maxn];
bool is,vis[26];
void fd(int fa,int u,bool o){//o是为了防止刚进去就被判到环
if(u==fa && o){
is=1;//找到环了
return ;
}
for(int i=0;i<26;i++)
if(!vis[i] && e[u][i])
vis[i]=1,fd(fa,i,1);//往前走
}
bool solve(){
memset(e,0,sizeof(e));
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<n;i++){
string s=a[i],t=a[i+1];
bool f=1;
for(int i=0;i<min((int)s.length(),(int)t.length());i++)
if(s[i]!=t[i]){
e[s[i]-'a'][t[i]-'a']=1,f=0;//加边
break;
}
if(f && s.length()>t.length()) return 0;//s不等于t且t是s前缀
}
for(int i=0;i<26;i++){
is=0;
memset(vis,0,sizeof(vis));
fd(i,i,0);
if(is) return 0;
}
return 1;
}
int main(){
while(scanf("%d",&n)){
if(!n) break;
if(solve()) puts("yes");
else puts("no");
}
return 0;
}