题目要求按字典序排列,而且可能有重边

所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面

这里有一点问题就是我一开始使用的是qsort:

int cmp(const void *s1 , const void *s2)
{
    return strcmp((char*)s1 , (char*)s2)<0;
}

qsort(str , n , sizeof(str[0]) , cmp)

poj一直wa,试了发zoj却过了,可能是编译器原因吧,然后将字符串放入了结构体重新进行排序,poj才给过

寻找欧拉回路的关键代码

void dfs(int u , int id)
{
    for(int i=first[u] ; i!=-1 ; i=e[i].next){
        if(e[i].flag){
            e[i].flag=false;
            dfs(e[i].y , e[i].id);
            rec[top2++]=e[i].id;
        }
    }
}

将其逆序输出即可

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1010
int n , in[N] , out[N] , cnt , st , la;
int first[N] , k;
int top1 , top2;
int rec[N]; struct Str{
char str[];
}str[N]; bool cmp(Str s1 , Str s2)
{
return strcmp(s1.str , s2.str)>;
} struct Edge{
int y , next , id;
bool flag;
}e[N*]; Edge stack[N]; void add_edge(int x,int y ,int id)
{
e[k].y=y , e[k].id = id , e[k].flag=true , e[k].next=first[x];
first[x]=k++;
} void dfs(int u , int id)
{
for(int i=first[u] ; i!=- ; i=e[i].next){
if(e[i].flag){
e[i].flag=false;
dfs(e[i].y , e[i].id);
rec[top2++]=e[i].id;
}
}
} void Fleury()
{
top1 = top2 = ;
dfs(st , -);
} int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%d" , &n);
for(int i= ; i<n ; i++) scanf("%s" , str[i].str);
sort(str , str+n , cmp);
// for(int i=0 ; i<n ; i++) printf("%s\n" , str[i]);
memset(first , - , sizeof(first));
memset(in , , sizeof(in));
memset(out , , sizeof(out));
k=;
for(int i= ; i<n ; i++){
int len = strlen(str[i].str);
int a = str[i].str[]-'a' , b = str[i].str[len-]-'a';
add_edge(a , b , i);
in[b]++ , out[a]++;
}
cnt=,st=- , la=-; bool flag=true;
for(int i=;i<;i++){
if(abs(out[i]-in[i])>){
flag=false;
break;
}
if(out[i]!=in[i]){
cnt++;
if(st==- && out[i]==in[i]+) st=i;
else if(la==- && in[i]==out[i]+) la=i;
else{
flag=false;
break;
}
}
}
if(!flag || (cnt!= && cnt!=)){printf("***\n");continue;} if(st<){
for(int i= ; i< ; i++)
if(out[i]){
st = i;
break;
}
}
Fleury();
// cout<<top2<<endl;
if(top2<n){printf("***\n");continue;}
for(int i=top2- ; i> ; i--) printf("%s." , str[rec[i]].str);
printf("%s\n" , str[rec[]].str);
}
return ;
}

最新文章

  1. (转载)SQL Reporting Services (Expression Examples)
  2. 一个面试题的解答-----从500(Id不连续)道试题库里随机抽取20道题!
  3. nginx访问日志获取访问前10的url
  4. 20145208 《Java程序设计》第7周学习总结
  5. 二叉索引树BIT
  6. 我的android学习经历24
  7. 2016年如果还没有关注这些机器人公司,你就out了
  8. Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志
  9. Windows服务器Pyton辅助运维--03.安装Visual Studio 的 Python 开发插件 PTVS
  10. Quality Over Quantity: 更少一些,更好一些_第1页_福布斯中文网
  11. [置顶] JDK-Future 模式和实现
  12. UML九种图汇总
  13. cocos2d-3.x 创建动画
  14. Centos7 Nginx开机启动
  15. JVM内存管理(转)
  16. 一个由SEO优化展开的meta标签大讲解
  17. hdu 3853 概率dp
  18. RTU命令设置笔记
  19. jQuery事件和动画
  20. UI设计可供性解析:巧用隐藏的设计力提升用户体验

热门文章

  1. POJ 3522 Slim Span 暴力枚举 + 并查集
  2. 非常强大的前端插件:emmet
  3. ASP.NET Web API 2 框架揭秘
  4. 多线程wait和notify实现1212
  5. 第一个 swift 项目
  6. Web前端攻防,一不小心就中招了
  7. ubuntu下php安装目录说明
  8. ECharts是我接触过的最优秀的可视化工具,也是进步最快的软件,希望它早日成为世界级的开源项目。
  9. linux下的基础操作
  10. 课外作业(建立double类型的小数,按照四舍五入保留2位小数)