zoukankan      html  css  js  c++  java
  • 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("***
    ");
        }
    }
  • 相关阅读:
    PHP输出语法:echo、var_dump、print、print_r区别对比
    深浅拷贝
    deepin
    linux 扩容磁盘空间
    tcpdump抓包与tcp握手
    linux 搭建FTP
    ubuntu基本配置
    linux 安装kmv创建虚拟机后网络配置
    selenium + pyautogui 实现淘宝自动登录
    pycharm 加载不出来已安装的selenium包或者其他已安装的package
  • 原文地址:https://www.cnblogs.com/tun117/p/4875963.html
Copyright © 2011-2022 走看看