首页 > 代码库 > [题解]UVA10129 Play on Words
[题解]UVA10129 Play on Words
链接:http://vjudge.net/problem/viewProblem.action?id=19492
描述:单词接龙
思路:求欧拉回路或欧拉道路。
首先建图,以字母为节点,单词为边。因为单词不可能倒序,所以是有向图。
判断图的连通性,dfs就可以做到,把它当成无向图就好了。然后判断点的出入度就可以判断是不是欧拉回路或者欧拉道路。
下面是我的实现。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define Max 30 6 #define MaxLen 1010 7 int T,n,Bgn; 8 int Edge[Max][Max],Chu[Max],Ru[Max]; 9 bool vis[Max];10 char str[MaxLen];11 inline void Get_int(int &Ret)12 {13 char ch;14 bool flag=false;15 for(;ch=getchar(),ch<‘0‘||ch>‘9‘;)16 if(ch==‘-‘)17 flag=true;18 for(Ret=ch-‘0‘;ch=getchar(),ch>=‘0‘&&ch<=‘9‘;Ret=Ret*10+ch-‘0‘);19 flag&&(Ret=-Ret);20 }21 inline void Read()22 {23 Get_int(n);24 memset(vis,false,sizeof(vis));25 memset(Chu,0,sizeof(Chu));26 memset(Ru,0,sizeof(Ru));27 memset(Edge,0,sizeof(Edge));28 int i,u,v,Len;29 for(i=1;i<=n;i++)30 {31 do32 {33 scanf("%s",str);34 Len=strlen(str);35 }while(!Len);36 u=str[0]-‘a‘+1; v=str[Len-1]-‘a‘+1;37 //if(u==v) continue;38 Edge[u][v]++;Edge[v][u]++;39 Chu[u]++;Ru[v]++;40 vis[u]=vis[v]=true;41 }42 Bgn=u;43 }44 void Dfs(int u)45 {46 vis[u]=false;47 for(int i=1;i<=26;i++)48 if(Edge[u][i]&&vis[i])49 Dfs(i);50 }51 inline bool Solve()52 {53 int i,ch=0,ru=0;54 Dfs(Bgn);55 for(i=1;i<=26;i++)56 {57 if(vis[i])58 return false;59 if(Chu[i]!=Ru[i])60 {61 if(Chu[i]-Ru[i]==1)62 ch++;63 else if(Ru[i]-Chu[i]==1)64 ru++;65 else66 return false;67 }68 }69 if((ch==1&&ru==1)||(ch==0&&ru==0))70 return true;71 return false;72 }73 int main()74 {75 Get_int(T);76 while(T--)77 {78 Read();79 if(Solve())80 printf("Ordering is possible.\n");81 else82 printf("The door cannot be opened.\n");83 }84 return 0;85 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。