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

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

这里有一点问题就是我一开始使用的是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 ;
}

poj 2337 && zoj 1919 欧拉回路+连通性判断的更多相关文章

  1. POJ 2337 Catenyms (欧拉回路)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8173   Accepted: 2149 Descript ...

  2. poj 2337(单向欧拉路的判断以及输出)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11648   Accepted: 3036 Descrip ...

  3. UVA12188-Inspector's Dilemma(欧拉回路+连通性判断)

    Problem UVA12188-Inspector's Dilemma Time Limit: 3000 mSec Problem Description In a country, there a ...

  4. poj 1300 Door Man 欧拉回路

    题目链接:http://poj.org/problem?id=1300 You are a butler in a large mansion. This mansion has so many ro ...

  5. HDU 1878 欧拉回路(判断欧拉回路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 题目大意:欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一 ...

  6. POJ 2337 Catenyms (欧拉图)

    本文链接http://i.cnblogs.com/EditPosts.aspx?postid=5402042 题意: 给你N个单词,让你把这些单词排成一个序列,使得每个单词的第一个字母和上一个字单词的 ...

  7. POJ 1562 && ZOJ 1709 Oil Deposits(简单DFS)

    题目链接 题意 : 问一个m×n的矩形中,有多少个pocket,如果两块油田相连(上下左右或者对角连着也算),就算一个pocket . 思路 : 写好8个方向搜就可以了,每次找的时候可以先把那个点直接 ...

  8. poj 1041(字典序输出欧拉回路)

    John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8641   Accepted: 2893   Spe ...

  9. POJ 3076 / ZOJ 3122 Sudoku(DLX)

    Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...

随机推荐

  1. ISCSI存储

    slave-147作为服务端 需要安装的软件 [root@slave-147 ~]# yum install -y scsi-target-utils slave-148和slave-149作为客户端 ...

  2. ionic back 返回按钮不正常显示&&二级路由点击返回按钮失效无法返回到上一级页面的问题

    很多时候,app不只有一两级路由,还要三四级路由,但是在ionic中,给出的返回键三级或四级无法使用,所以得自定义方法设置返回. 直接贴代码: <ion-nav-buttons side=&qu ...

  3. Android设计模式——MVP

    一.什么是MVP MVP:全称 Model-View-Presenter. MVP框架由3部分组成:View层负责显示,Presenter层负责逻辑处理,Model层提供数据. View:负责绘制UI ...

  4. 关于setTimeout和Promise执行顺序问题

    先看一段代码 console.log('打印'+1); setTimeout(function(){ console.log('打印'+2); }) new Promise(function(reso ...

  5. 031_spark架构原理

    spark核心组件 driver master worker executor task(只有task是线程) 核心组件的原理图解

  6. Linux PHP的运行模式

    关系图 首先聊一下服务器,常见的web server类型有apache和nginx Apache工作模式 Apache的工作模式是Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦 ...

  7. (2)Ngixn 编译安装设置开机自启

    设置nginx开机自启 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 ...

  8. javaee 第四周作业

    分析hello.java.下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 /** * Copyr ...

  9. 10g集群启动顺序

    1. 首先, /etc/inittab(不同平台文件名可能不同),文件中的下面3行被调用. h1:35:respawn:/etc/init.d/init.evmd run >/dev/null ...

  10. springBoot + KISSO实现单点登录

    1:创建一个maven项目 kisso,然后再创建二个子项目都是springboot 2:二个boot项目的pom.xml都是一样的 就这三个依赖,3:接下来就是码代码了,首先在(在我这里)sprin ...