• POJ2337 Catenyms


    题意:给出一组单词,如果两个单词,一个单词的头和另一个单词的尾相同,则可以相连,

    例如abce, efdg,可以相连,问这组单词能否排成一排,如果可以求出字典序自小的那个。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <cstdio>
    #include <string>using namespace std;
    struct Edge
    {
        int to,next;
        int index;
        bool flag;
    }edge[2010];
    int head[30],tot;
    void init()
    {
        tot = 0;
        memset(head,-1,sizeof(head));
    }
    void addedge(int u,int v,int index)
    {
        edge[tot].to = v;
        edge[tot].next = head[u];
        edge[tot].index = index;
        edge[tot].flag = false;
        head[u] = tot++;
    }
    string str[1010];
    int in[30],out[30];
    int cnt;
    int ans[1010];
    void dfs(int u)
    {
        for(int i = head[u] ;i != -1;i = edge[i].next)
            if(!edge[i].flag)
            {
                edge[i].flag = true;
                dfs(edge[i].to);
                ans[cnt++] = edge[i].index;
            }
    }
    int main()
    {
        freopen("in.txt","r",stdin);
        int T,n;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i = 0;i < n;i++)
                cin>>str[i];
            sort(str,str+n);//要输出字典序最小的解,先按照字典序排序
            init();
            memset(in,0,sizeof(in));
            memset(out,0,sizeof(out));
            int start = 100;
            for(int i = n-1;i >= 0;i--)//字典序大的先加入
            {
                int u = str[i][0] - 'a';
                int v = str[i][str[i].length() - 1] - 'a';
                addedge(u,v,i);
                out[u]++;
                in[v]++;
                if(u < start)start = u;
                if(v < start)start = v;
            }
            int cc1 = 0, cc2 = 0;
            for(int i = 0;i < 26;i++)
            {
                if(out[i] - in[i] == 1)
                {
                    cc1++;
                    start = i;//如果有一个出度比入度大1的点,就从这个点出发,否则从最小的点出发
                }
                else if(out[i] - in[i] == -1)
                    cc2++;
                else if(out[i] - in[i] != 0)
                    cc1 = 3;
            }
            if(! ( (cc1 == 0 && cc2 == 0) || (cc1 == 1 && cc2 == 1) ))
            {
                printf("***
    ");
                continue;
            }
            cnt = 0;
            dfs(start);
            if(cnt != n)//判断是否连通
            {
                printf("***
    ");
                continue;
            }
            for(int i = cnt-1; i >= 0;i--)
            {
                cout<<str[ans[i]];
                if(i > 0)printf(".");
                else printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    利用opengl画一个水波的曲面
    Eclipse 使用OpenGL
    Javascript学习过程(二)
    Workflow Learing
    YAWL设计实例
    YAWL使用方法
    ImageJ二次开发学习纪录之初步体会
    [LeetCode 660] Remove 9
    [LeetCode 1542] Find Longest Awesome Substring
    [LeetCode 879] Profitable Schemes
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4783011.html
Copyright © 2020-2023  润新知