整整一天都在弄这个 ,终于AC了 。
需要注意的地方都在代码注释里了!
#include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; #define EMAX 1030 int t,n; int num;//记录边数目 int vis[30]; int head[EMAX]; int next[EMAX]; int fa[30]; int in[30]; int out[30]; int stk[EMAX];//记录打印顺序 int top; string str[EMAX]; struct node { int u;//起点 int v;//终点 string s; int flag; }; node edge[EMAX]; int num1,num2; void init() { num=0; top=0; memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); memset(next,-1,sizeof(next)); for(int i=0;i<30;i++) fa[i]=i; } //添加边的方法 void addnode(int u,int v,string s) { edge[num].u=u; edge[num].v=v; edge[num].s=s; edge[num].flag=0; next[num]=head[u]; head[u]=num++; } //find int find(int a) { if(a==fa[a]) return a; else return fa[a]=find(fa[a]); } bool cmp(string a,string b) { return a>b; //因为是用头插法建立节点 所有必须从大到小排序 } int iseuler() { // 第一个条件 int fnum=0; int i; for(i=1;i<=26;i++) if(vis[i]&&find(i)==i) fnum++; if(fnum>1) return 0; //第二个条件 num1=num2=0; for(i=1;i<=26;i++) if(vis[i]&&in[i]!=out[i]) { if(in[i]-out[i]==1) num1++; else if(out[i]-in[i]==1) num2++; else return 0; } if(num1==1&&num2==1) return 1; if(num1==0&&num2==0) return 1; return 0; } void dfs(int from) { for(int i=head[from];i!=-1;i=next[i]) { if(!edge[i].flag) { edge[i].flag=1; dfs(edge[i].v); stk[top++]=i; } } } int main() { //freopen("in.txt","r",stdin); scanf("%d",&t); while(t--) { int i; scanf("%d",&n); init();//初始化 for(i=0;i<n;i++) { // scanf("%s",str[i]); cin>>str[i]; } //排序 sort(str,str+n,cmp); for(i=0;i<n;i++) { int u=str[i][0]-'a'+1;//顶点从1到26 int v=str[i][(str[i].length())-1]-'a'+1; vis[u]=1; vis[v]=1; out[u]++; in[v]++; if(find(u)!=find(v)) fa[find(v)]=find(u); addnode(u,v,str[i]);//边从0到num } if(iseuler()) { int start;//起点的选择:如果是欧拉通路 则选择出度比入度大一的那个点, //否则选字典序最小的那个点!! 这点很重要! //选择入口 if(num1==1&&num2==1) { for(int k=0;k<num;k++) { if(out[edge[k].u]-in[edge[k].u]==1) { start=k; break; } } } else { start=num-1;//选字典序最小的那个dian } dfs(edge[start].u); for(i=num-1;i>0;i--) cout<<edge[stk[i]].s<<"."; cout<<edge[stk[i]].s<<endl; } else { printf("***\n"); } } return 0; }
因为该题要按字典序输出,我就再这里WA了好久 ,,一开始我是将各个字符串从小到大排序,而我采用的是头插法建立节点。这样同一起点的单词 不一定会按照从小到大的排序的。 如ab aba 。所以应该从大到小排序。
还有一点要注意的是
选择起点:如果是欧拉通路选择出度比入度大一的点,如果是回路,则选择字典序最小的那个点,以它为入口
相关推荐
标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...
标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...
标题中的"poj_2682(3).rar"是一个指向编程竞赛问题的引用,通常这类问题在网站如POJ(Programming Online Judge)上出现,供程序员解决并提交代码进行测试。这个问题的编号是2682,可能涉及到特定的数据结构或算法...
标题中的“pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11”似乎是指北京大学(Peking University, PKU)编程竞赛中的一道题目,编号为1151,与“Atlantis”这个主题相关。这道题目在多个平台上也被提及...
标题中的“poj2488.rar_poj24_poj2488_方向模板法”指的是一个解决编程竞赛问题POJ2488的压缩文件,其中可能包含了解决该问题的代码示例。POJ是Programming Online Judge的缩写,是一个在线的编程竞赛平台,参与者...
《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...
【标题】"POJ3601.rar" 是一个压缩包文件,主要包含了对北京大学在线评测系统(Online Judge)上的一道题目——POJ 3601的解答和相关实验报告。"POJ 3601"是这道编程问题的编号,通常在编程竞赛或练习平台中,每个...
标题中的“poj1038--Bugs.rar”是一个关于解决编程竞赛问题的压缩文件,其中包含了对“Bugs”问题的解答。POJ(Problemset Online Judge)是一个在线编程竞赛平台,它提供了一系列的问题供参赛者解决,旨在锻炼和...
【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...
标题中的“POJ3277.rar_3277 poj_poj3277_多个面积_线段树”是指一个与编程竞赛相关的压缩文件,特别提到了POJ(Problemset Online Judge)的第3277号问题。POJ是一个著名的在线编程竞赛平台,参与者需要解决各种...
标题 "ACM.zip_ACM_poj_poj3187_poj3669" 提供的信息表明,这个压缩包包含的是与ACM(国际大学生程序设计竞赛)相关的编程题目解决方案,具体是POJ(Programming Online Judge)平台上的两道题目,编号分别为poj3187...
【标题】"POJ1753.rar_poj 1753_poj1753" 提供的资源是关于POJ1753编程挑战的解决方案,其中包括了完整的代码实现以及实验报告。POJ(Problem Online Judge)是中国大学常用的在线编程竞赛平台,它提供了一系列的...
标题“POJ14_MONI2.zip”暗示这是一个与编程竞赛相关的压缩文件,很可能包含了某个特定问题的解决方案或代码示例。"POJ"通常指的是“Programming Online Judge”,这是一个在线编程竞赛平台,让参赛者解决各种算法...
标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...
标题中的"string-problem(POJ).rar_POJ 19_poj"表明这是一个与ACM编程竞赛相关的压缩包,特别关注的是字符串处理问题。在ACM编程竞赛中,字符串问题是一个常见的类别,通常涉及到字符串的查找、比较、操作、模式匹配...
《POJ 1990:树状数组解题策略详解》 在编程竞赛的世界里,POJ(Programming Online Judge)是一个备受瞩目的在线评测系统,它提供了丰富的编程题目供参赛者挑战。其中,编号为1990的题目是一道涉及数据结构与算法...
标题中的"POJ3322.rar_poj33_www.3322.se.c"暗示这是一个关于编程竞赛的问题,POJ(Problem Online Judge)是著名的在线编程竞赛平台,而"3322"是该平台上问题的编号。这个问题可能是从www.3322.se.c这个网站上获取...
- **题目描述**:这是一个单词接龙游戏的问题,可以通过构建图来解决,其中节点代表单词,边代表单词之间的转换关系。 - **解题思路**:构建一个无向图,然后判断是否存在欧拉回路。 - **数据结构**:使用邻接表...
《多种解题技巧在POJ1035_Spelling Checker中的应用》 在编程竞赛领域,ACM(国际大学生程序设计竞赛)是一项备受瞩目的赛事,它要求参赛者在有限的时间内解决一系列复杂的算法问题。POJ(Problemset Online Judge...
【标题】"poj_1699.rar_1699_poj_poj1699" 提供的是一个关于POJ(编程在线判题系统)第1699题的解决方案,其中包含了该问题的代码实现和解题思路。POJ是一个流行的在线编程竞赛平台,它为参赛者提供了各种算法题目,...