POJ 2337 【字典序】【欧拉回路】

题意:

给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排。

如果有多组解,输出字典序最小的一组解。

这题...

WA了两天。

错误有以下:

1.没有初始化好起始位置,默认起始位置是a了。想想想如果单词中都不带a开头的不就傻逼了吗。

2.没有理解好字典序,觉得只要保证每次都从尽量小的字母开始往下搜索就可以了,其实不然,我这样只是使得我下次找到的字母字典序最小而没有保证我本次找到的字母是字典序最小的。譬如若同时存在ab和aba我会优先搜索aba,但是事实上ab的字典序更小。

#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
int n;
queue<string>pho[30];
bool ok[30];
int me[30];
int in[30];
int out[30];
string tmp[1010];
queue<int>jilu[30][30];
stack<int>s;
int snum;
int tmps[1050];
void dfs(int x)
{
    s.push(x);
    if(!pho[x].empty())
    {
        string meme=pho[x].front();
        pho[x].pop();
        dfs(meme[meme.length()-1]-96);
    }
}
int findme(int a)
{
    if(a!=me[a])
        return me[a]=findme(me[a]);
    return a;
}
void Fleury(int x)
{
    snum=0;
    s.push(x);
    while(!s.empty())
    {
        int b=0;
        if(!pho[s.top()].empty())
        {
            b=1;
        }
        if(b==0)
        {
            tmps[snum++]=s.top();
            s.pop();
        }
        else
        {
            int y=s.top();
            s.pop();
            dfs(y);
        }
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int start=9000;
        memset(ok,0,sizeof(ok));
        for(int i=1; i<=26; i++)
        {
            me[i]=i;
        }
        while(!s.empty())
            s.pop();
        memset(out,0,sizeof(out));
        memset(in,0,sizeof(in));
        for(int i=1; i<=26; i++)
        {
            while(!pho[i].empty())
            {
                pho[i].pop();
            }
            for(int j=1; j<=26; j++)
            {
                while(!jilu[i][j].empty())
                {
                    jilu[i][j].pop();
                }
            }
        }
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            cin>>tmp[i];
        }
        sort(tmp+1,tmp+1+n);
        for(int i=1; i<=n; i++)
        {
            if(start>min((int)tmp[i][0]-96,(int)tmp[i][tmp[i].length()-1]-96))
                start=min((int)tmp[i][0]-96,(int)tmp[i][tmp[i].length()-1]-96);
            pho[tmp[i][0]-96].push(tmp[i]);
            jilu[tmp[i][0]-96][tmp[i][tmp[i].length()-1]-96].push(i);
            in[tmp[i][tmp[i].length()-1]-96]++;
            out[tmp[i][0]-96]++;
            ok[tmp[i][0]-96]=1;
            ok[tmp[i][tmp[i].length()-1]-96]=1;
            int tmpxx=findme((int)(tmp[i][0]-96));
            int tmpyy=findme((int)(tmp[i][tmp[i].length()-1]-96));
            if(tmpxx!=tmpyy)
                me[tmpyy]=tmpxx;
        }
        int x=0,y=0,z=0;
        for(int i=1; i<=26; i++)
        {
            if(ok[i])
            {
                if(in[i]==out[i])
                    continue;
                else if(in[i]==out[i]+1)
                    x++;
                else if(out[i]==in[i]+1)
                {
                    y++;
                    start=i;
                }
                else
                    z++;
            }
        }
        int myt=0;
        for(int i=1; i<=26; i++)
        {
            if(ok[i])
            {
                if(me[i]==i)
                    myt++;
            }
        }
        //printf("%d %d %d %d
",x,y,z,myt);
        if(z||myt>1)
            printf("***
");
        else if((y==1&&x==1)||(x==0&&y==0))
        {
            Fleury(start);
            for(int i=snum-2; i>=0; i--)
            {
                cout<<tmp[jilu[tmps[i+1]][tmps[i]].front()];
                jilu[tmps[i+1]][tmps[i]].pop();
                if(i)
                    printf(".");
            }
            printf("
");
        }
        else
            printf("***
");
    }
}
原文地址:https://www.cnblogs.com/tun117/p/4875963.html