POJ 1386 单词接龙问题
2014-08-30 09:57
176 查看
题目大意:
给一堆字母,让它们进行接龙,要头对尾能够接的上,问有没有一种方法让所有成语都完成接龙
这道题实际上是在考虑是否存在一条欧拉通路,每个单词产生一条有向线段,由第一个字母指向最后一个字母
这道题另一个需要考虑的是是否所有存在的字母都是处于一个连通分量中的,这里我们考虑用并查集来解决问题。
代码如下:
给一堆字母,让它们进行接龙,要头对尾能够接的上,问有没有一种方法让所有成语都完成接龙
这道题实际上是在考虑是否存在一条欧拉通路,每个单词产生一条有向线段,由第一个字母指向最后一个字母
这道题另一个需要考虑的是是否所有存在的字母都是处于一个连通分量中的,这里我们考虑用并查集来解决问题。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int fa[30],in[30],out[30],visit[30]; char str[1005]; int find_head(int x) { int u=x; while(x!=fa[x]){ x=fa[x]; } fa[u]=x; return x; } int Union(int x,int y) { int fa_x=find_head(x); int fa_y=find_head(y); if(fa_x!=fa_y){ fa[fa_x]=fa_y; } return fa_y; } int main() { int T,n,tmp; scanf("%d",&T); while(T--){ scanf("%d",&n); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(visit,0,sizeof(visit)); for(int i=1;i<=26;i++) fa[i]=i; for(int i=0;i<n;i++){ scanf("%s",str); int len=strlen(str); out[str[0]-'a'+1]++; in[str[len-1]-'a'+1]++; tmp=Union(str[0]-'a'+1,str[len-1]-'a'+1);//记录那个唯一的头结点 //cout<<tmp<<endl; visit[str[0]-'a'+1]=1; visit[str[len-1]-'a'+1]=1; } bool flag=true; for(int i=1;i<=26;i++){ if(visit[i]){ if(find_head(i)!=tmp){flag=false;break;} } } int cnt1=0,cnt2=0; for(int i=1;i<=26;i++){ if(visit[i]){ if(in[i]-out[i]==1) cnt1++; else if(out[i]-in[i]==1) cnt2++; else if(in[i]!=out[i]) {flag=false;break;} } } if(!flag){ printf("The door cannot be opened.\n"); //continue; } else if((cnt1==1&&cnt2==1)||(cnt1==0&&cnt2==0)) puts("Ordering is possible."); else puts("The door cannot be opened."); } return 0; }
相关文章推荐
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- poj 1386 Play on Words(欧拉路径存在的判断问题)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- POJ 2.5 8783 && luogu p1019 单词接龙
- 图论欧拉路径问题(单词接龙)
- 图论欧拉路径问题(单词接龙)
- poj 1386 单词连接 欧拉图+并查集判连通
- 图论欧拉路径问题(单词接龙)