POJ 2337 欧拉回路
2016-07-17 17:17
295 查看
题意:
如果给出的单词能够首尾相接,请按字典序输出单词,中间要加’.’
否则输出三个”*”.
思路:
欧拉回路
记得按字典序排序哦~
加边的时候要倒着加。(邻接表遍历的时候是反着的)
记得清空vis数组(因为这个无脑错误WA了好长时间。。。。。)
随便搞搞 就能过了。 数据不是很强…
如果给出的单词能够首尾相接,请按字典序输出单词,中间要加’.’
否则输出三个”*”.
思路:
欧拉回路
记得按字典序排序哦~
加边的时候要倒着加。(邻接表遍历的时候是反着的)
记得清空vis数组(因为这个无脑错误WA了好长时间。。。。。)
随便搞搞 就能过了。 数据不是很强…
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[1005][25]; int first[60],next[1005],tot,top,v[1005]; int cases,n,ansx,ansy,ansz,in[26],out[26],ans[1005]; bool vis[1005],flag,VIS[26]; struct node{char str[25];int length;}edge[1005]; void add(int x,int y,int z){v[z]=y;next[z]=first[x];first[x]=z;} bool cmp(node x,node y){return strcmp(x.str,y.str)>0?0:1;} void dfs(int x){ for(int i=first[x];~i;i=next[i]) if(!vis[i]){ VIS[v[i]]=1; vis[i]=1,dfs(v[i]); ans[++top]=i; } } int main(){ scanf("%d",&cases); while(cases--){ memset(first,-1,sizeof(first)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(vis,0,sizeof(vis)); memset(VIS,0,sizeof(VIS)); flag=ansx=ansy=ansz=top=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",edge[i].str); edge[i].length=strlen(edge[i].str); out[edge[i].str[0]-'a']++; in[edge[i].str[edge[i].length-1]-'a']++; } sort(edge+1,edge+1+n,cmp); for(int i=n;i;i--) add(edge[i].str[0]-'a',edge[i].str[edge[i].length-1]-'a',i); for(int i=0;i<=25;i++){ if(in[i]-out[i]==1)ansx++; else if(out[i]-in[i]==1)ansy++; else if(in[i]!=out[i])ansz++; } if(!ansz&&ansx==ansy&&(ansx==0||ansx==1)){ int jy; if(ansx==1){ for(int i=0;i<26;i++) if(out[i]-in[i]==1){jy=i;break;} } else{ for(int i=0;i<26;i++) if(out[i]){jy=i;break;} } VIS[jy]=1; dfs(jy); for(int i=0;i<=25;i++) if((in[i]||out[i])&&!VIS[i])flag=1; } else flag=1; if(!flag){ for(int i=top;i>=2;i--) printf("%s.",edge[ans[i]].str); printf("%s\n",edge[ans[1]].str); } else puts("***"); } }
相关文章推荐
- 我是运营,我没有假期
- 文件遍历排序函数
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- Lua 学习笔记之C API 遍历 Table实现代码
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- C#实现窗体间传递数据实例
- C#中的委托数据类型简介
- SQL Server删除表及删除表中数据的方法
- SqlServer2008误操作数据(delete或者update)后恢复数据的方法
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- Oracle数据库数据丢失恢复的几种方法总结