• poj2337欧拉回路要求输出路径


                         Catenyms
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 8368   Accepted: 2202

    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 example, the following are catenyms:
    dog.gopher
     gopher.rat
     rat.tiger
     aloha.aloha
     arachnid.dog
    A compound catenym is a sequence of three or more words separated by periods such that each adjacent pair of words forms a catenym. For example,
    aloha.aloha.arachnid.dog.gopher.rat.tiger
    Given a dictionary of lower case words, you are to find a compound catenym that contains each of the words exactly once.

    Input

    The first line of standard input contains t, the number of test cases. Each test case begins with 3 <= n <= 1000 - the number of words in the dictionary. n distinct dictionary words follow; each word is a string of between 1 and 20 lowercase letters on a line by itself.

    Output

    For each test case, output a line giving the lexicographically least compound catenym that contains each dictionary word exactly once. Output "***" if there is no solution.

    Sample Input

    2
    6
    aloha
    arachnid
    dog
    gopher
    rat
    tiger
    3
    oak
    maple
    elm
    

    Sample Output

    aloha.arachnid.dog.gopher.rat.tiger
    ***
    
    用DFS实现的
      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <algorithm>
      4 #include <string.h>
      5 #include <math.h>
      6 #include <vector>
      7 #include <stack>
      8 #include <map>
      9 using namespace std;
     10 #define ll long long int
     11 #define INF 5100000
     12 string a[1500];
     13 int v[2000];
     14 vector<pair<int,int> >aa[30];
     15 vector<int>ab;
     16 int p[30];
     17 int d1[30];
     18 int d2[30];
     19 int find(int x)
     20 {
     21     while(x!=p[x])
     22         x=p[x];
     23     return x;
     24 }
     25 void fun(int x,int eid)
     26 {
     27     for(int i=0; i<aa[x].size(); i++)
     28         if(!v[aa[x][i].second])
     29         {
     30             v[aa[x][i].second]=true;
     31             fun(aa[x][i].first,aa[x][i].second);
     32         }
     33     if(eid>0)ab.push_back(eid);
     34 }
     35 int main()
     36 {
     37     int tt;
     38     int i,j;
     39     cin>>tt;
     40     for(i=0; i<tt; i++)
     41     {
     42         int n;
     43         cin>>n;
     44         memset(d1,0,sizeof(d1));
     45         memset(d2,0,sizeof(d2));
     46         for(j=1; j<30; j++)
     47             p[j]=j,aa[j].clear();
     48         for(j=1; j<=n; j++)
     49         {
     50             cin>>a[j];
     51         }
     52         sort(a+1,a+n+1);
     53         for(j=1; j<=n; j++)
     54         {
     55             int x=a[j][0]-'a'+1;
     56             int y=a[j][a[j].length()-1]-'a'+1;
     57             d1[x]++;
     58             d2[y]++;
     59             aa[x].push_back(make_pair(y,j));
     60             int fx=find(x);
     61             int fy=find(y);
     62             if(fy!=fx)
     63                 p[fy]=fx;
     64         }
     65         int sum=0;
     66         int start=a[1][0]-'a'+1;
     67         for(j=1; j<30; j++)
     68         {
     69             if(d1[j]==0&&d2[j]==0)continue;
     70             if(p[j]==j)sum++;
     71         }
     72         if(sum>1)
     73             cout<<"***"<<endl;
     74         else
     75         {
     76             int dd1=0,dd2=0;
     77             for(j=1; j<30; j++)
     78             {
     79                 if(d1[j]!=d2[j])
     80                 {
     81                     if(d1[j]-d2[j]==1)
     82                         dd1++,start=j;
     83                     else if(d2[j]-d1[j]==1)
     84                         dd2++;
     85                     else
     86                     {
     87                         dd2=199;
     88                         break;
     89                     }
     90                 }
     91             }
     92             if(dd2<=1&&dd1<=1)
     93             {
     94                 memset(v,0,sizeof(v));
     95                 ab.clear();
     96                 fun(start,0);
     97                 for( j=ab.size()-1; j>=0; j--)
     98                 {
     99                     cout<<a[ab[j]];
    100                     if(j!=0)cout<<".";
    101                     else cout<<"
    ";
    102                 }
    103 
    104             }
    105             else cout<<"***"<<endl;
    106         }
    107     }
    108 }
    View Code
  • 相关阅读:
    解决Mac下GDB提示签名错误
    hdu 5015 大数量反复类似操作问题/ 矩阵高速幂
    数据运营报表系统思考 一二
    NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本
    STL 源代码剖析 算法 stl_algo.h -- equal_range
    java字符操作获取汉字的拼音以及其它经常使用工具
    SRAM,SDRAM,网卡
    java.lang.NoClassDefFoundError: ognl/PropertyAccessor解决的方法
    纯手工定制西服怎么鉴别
    缝份_百度百科
  • 原文地址:https://www.cnblogs.com/ERKE/p/3258774.html
Copyright © 2020-2023  润新知