题目要求按字典序排列,而且可能有重边
所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面
这里有一点问题就是我一开始使用的是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;
}
}
}
将其逆序输出即可
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 #define N 1010 7 int n , in[N] , out[N] , cnt , st , la; 8 int first[N] , k; 9 int top1 , top2; 10 int rec[N]; 11 12 struct Str{ 13 char str[30]; 14 }str[N]; 15 16 bool cmp(Str s1 , Str s2) 17 { 18 return strcmp(s1.str , s2.str)>0; 19 } 20 21 struct Edge{ 22 int y , next , id; 23 bool flag; 24 }e[N*2]; 25 26 Edge stack[N]; 27 28 void add_edge(int x,int y ,int id) 29 { 30 e[k].y=y , e[k].id = id , e[k].flag=true , e[k].next=first[x]; 31 first[x]=k++; 32 } 33 34 void dfs(int u , int id) 35 { 36 for(int i=first[u] ; i!=-1 ; i=e[i].next){ 37 if(e[i].flag){ 38 e[i].flag=false; 39 dfs(e[i].y , e[i].id); 40 rec[top2++]=e[i].id; 41 } 42 } 43 } 44 45 void Fleury() 46 { 47 top1 = top2 = 0; 48 dfs(st , -1); 49 } 50 51 int main() 52 { 53 // freopen("a.in" , "r" , stdin); 54 int T; 55 scanf("%d" , &T); 56 while(T--) 57 { 58 scanf("%d" , &n); 59 for(int i=0 ; i<n ; i++) scanf("%s" , str[i].str); 60 sort(str , str+n , cmp); 61 // for(int i=0 ; i<n ; i++) printf("%s\n" , str[i]); 62 memset(first , -1 , sizeof(first)); 63 memset(in , 0 , sizeof(in)); 64 memset(out , 0 , sizeof(out)); 65 k=0; 66 for(int i=0 ; i<n ; i++){ 67 int len = strlen(str[i].str); 68 int a = str[i].str[0]-'a' , b = str[i].str[len-1]-'a'; 69 add_edge(a , b , i); 70 in[b]++ , out[a]++; 71 } 72 cnt=0,st=-1 , la=-1; 73 74 bool flag=true; 75 for(int i=0;i<26;i++){ 76 if(abs(out[i]-in[i])>1){ 77 flag=false; 78 break; 79 } 80 if(out[i]!=in[i]){ 81 cnt++; 82 if(st==-1 && out[i]==in[i]+1) st=i; 83 else if(la==-1 && in[i]==out[i]+1) la=i; 84 else{ 85 flag=false; 86 break; 87 } 88 } 89 } 90 if(!flag || (cnt!=0 && cnt!=2)){printf("***\n");continue;} 91 92 93 94 if(st<0){ 95 for(int i=0 ; i<26 ; i++) 96 if(out[i]){ 97 st = i; 98 break; 99 } 100 } 101 Fleury(); 102 // cout<<top2<<endl; 103 if(top2<n){printf("***\n");continue;} 104 for(int i=top2-1 ; i>0 ; i--) printf("%s." , str[rec[i]].str); 105 printf("%s\n" , str[rec[0]].str); 106 } 107 return 0; 108 }