POJ
来源:互联网 发布:如何保证数据的准确性 编辑:程序博客网 时间:2024/06/06 04:14
题解:判断一下是不是欧拉路,然后按字典序加边进去,最后就是欧拉回路的模板
#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<vector>using namespace std;typedef pair<int,int> P;const int mx = 1005;int in_deg[mx];int out_deg[mx];int vis[mx];string s[mx];vector<P>g[mx];int map[mx][mx];int ans[mx];int n,m,dfn,sum;void init(){ m = dfn = sum = 0; for(int i = 0; i < 26; i++) g[i].clear(); memset(in_deg,0,sizeof(in_deg)); memset(out_deg,0,sizeof(out_deg)); memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map));}void DFS(int u){ vis[u] = 1; dfn++; for(int v = 0; v < 26; v++){ // cout<<v<<endl; if(map[u][v]&&!vis[v]) DFS(v); }}int check(){ for(int u = 0; u < 26; u++) if(vis[u]){ memset(vis,0,sizeof(vis)); DFS(u); break; } // cout<<dfn<<endl; // cout<<sum<<endl; if(dfn!=sum) return 1; int so1 = 0,so2 = 0; for(int u = 0; u < 26; u++) if(out_deg[u]!=in_deg[u]){ if(out_deg[u]-in_deg[u]==1) so1++; else if(in_deg[u]-out_deg[u]==1) so2++; else return 1; } if(so1==1&&so2==1) return 2; if(so1==0&&so2==0) return 3; return 1;}void dfs(int u,int e){ int len = g[u].size(); for(int i = 0; i < len; i++){ P v = g[u][i]; if(!vis[v.second]){ vis[v.second]=1; dfs(v.first,v.second); } } ans[++m] = e;}int main(){ int t; scanf("%d",&t); while(t--){ init(); scanf("%d",&n); for(int i = 0; i < n; i++) cin>>s[i]; sort(s,s+n); for(int i = 0; i < n; i++){ int x = s[i][0]-'a'; int len = s[i].length(); int y = s[i][len-1]-'a'; P v; v.first = y; v.second = i; g[x].push_back(v); in_deg[y]++; out_deg[x]++; if(!vis[x]) sum++,vis[x] = 1; if(!vis[y]) sum++,vis[y] = 1; map[x][y] = 1; map[y][x] = 1; } int casei = check(); if(casei == 1) puts("***"); else if(casei == 2){ for(int u = 0; u < 26; u++) if(out_deg[u]>in_deg[u]){ memset(vis,0,sizeof(vis)); dfs(u,-1); break; } m--; while(m>=1){ cout<<s[ans[m]]; putchar(m==1?'\n':'.'); m--; } } else{ for(int u = 0; u < 26; u++) if(out_deg[u]){ memset(vis,0,sizeof(vis)); dfs(u,-1); break; } m--; while(m>=1){ cout<<s[ans[m]]; putchar(m==1?'\n':'.'); m--; } } } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- ACM训练日记—8月14日
- adb快速调试驱动常用命令
- 8-14
- 再linux环境上确认是否是手动kill掉进程
- kcws分词模型
- POJ
- PHP simplexml_load_string() 函数
- Java 环境变量配置
- 微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程__https://segmentfault.com/a/1190000004594385
- hdu 1285 确定比赛名次 (拓扑排序)
- 库time.h初探
- Linux设置CRT/mysql SSH登陆超时
- 32位操作系统与64位操作系统的区别
- ubuntu 命令行模式连接wifi