poj 2337 && zoj 1919 欧拉回路+连通性判断

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

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

这里有一点问题就是我一开始使用的是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 }
时间: 2024-11-08 23:37:42

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

UVA12188-Inspector&#39;s Dilemma(欧拉回路+连通性判断)

Problem UVA12188-Inspector's Dilemma Time Limit: 3000 mSec Problem Description In a country, there are a number of cities. Each pair of city is connected by a highway, bi-directional of course. A road-inspector's task is to travel through the highway

POJ 2337 &amp;&amp; ZOJ 1919--Catenyms 【有向图 &amp;&amp; 欧拉路判断 &amp;&amp; 欧拉路径】

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 2726 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For

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

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11648   Accepted: 3036 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For

poj 2337 欧拉回路按照最小字典序输出+注意为了按最小字典序怎么处理邻接表

http://poj.org/problem?id=2337 WA了好久,昨晚1点多睡不着写的,狂WA,当时是因为用邻接矩阵存储,比如aba,aa只能存下一个,这个之前还没遇到过,今天才注意到--邻接矩阵无法存储平行边, 关于欧拉回路判断看我另几篇日志或者看我的欧拉总结 再贴个输出欧拉回路的模板 其中,参数u是起点,注意如果是输出欧拉路径的话,u必须是出度比入度大一的那个点,如果输出欧拉回路,随便按要求找个就行 void euler(int u) { for(int i=head[u];i!=-

HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路.统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求.还有别忘了判断是否连通,此时用到并查集,图中所有的边

POJ 2337 Catenyms (欧拉回路+并查集)

题目地址:POJ 2337 这题跟POJ 1386差不多,只不过这题多一个输出路径而已. 按字母来建边,每个单词的首字母和尾字母加边.先判断是否连通,然后判断每个字母的入度和出度不能出现差的绝对值大于2,然后入度和出度差的绝对值为1的不能超过两个.就可以形成欧拉路径 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <alg

poj 1300 Door Man 欧拉回路

题目链接:http://poj.org/problem?id=1300 You are a butler in a large mansion. This mansion has so many rooms that they are merely referred to by number (room 0, 1, 2, 3, etc...). Your master is a particularly absent-minded lout and continually leaves door

poj 1465 &amp; zoj 1136 Multiple (BFS+余数重判)

Multiple Time Limit: 1000MS   Memory Limit: 32768K Total Submissions: 6177   Accepted: 1346 Description a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM (at least one), finds the small

poj 1094 / zoj 1060 Sorting It All Out

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26876   Accepted: 9271 Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from sm