UVA 10441 Catenyms【欧拉路】

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=41674

题意:给定一些单词,如果一个单词的尾字母与另一个的首字母相同则可以连接。问是否可以每个单词用一次,将所有单词连接,可以则输出字典序最小的序列。

代码:

#include <stdio.h>
#include <ctime>
#include <math.h>
#include <limits.h>
#include <complex>
#include <string>
#include <functional>
#include <iterator>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <bitset>
#include <sstream>
#include <iomanip>
#include <fstream>
#include <iostream>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>

using namespace std;

int t;
int n;
string s[1010];

struct Edge
{
    int to, next;
    int index;
    bool flag;
}edge[2010];

int head[300], 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++;
}

int in[250], out[250];

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()
{
    int t;
    cin >> t;
    while (t--)
    {

        scanf("%d",&n);
        for (int i = 0; i < n; i++)
            cin >> s[i];
        sort(s, s + 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 = s[i][0] - ‘a‘;
            int v = s[i][s[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;
            }
            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("***\n");
            continue;
        }
        cnt = 0;
        dfs(start);
        if (cnt != n)
        {
            printf("***\n");
            continue;
        }
        for (int i = n-1; i >=0 ; i--)
        {
            cout << s[ans[i]];
            if (i != 0) printf(".");
            else printf("\n");
        }
    }
    return 0;
}

版权声明:转载请注明出处。

时间: 2024-09-28 04:14:18

UVA 10441 Catenyms【欧拉路】的相关文章

UVA 10441 - Catenyms(欧拉道路)

UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定,最后dfs输出路径 代码: #include <cstdio> #include <cstring> #include <string> #include <vector> #include <iostream> #include <algo

Catenyms+欧拉回路/欧拉路+并查集+POJ

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9617   Accepted: 2524 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 e

uva 10129 Play on Words(欧拉路)

uva 10129 Play on Words Description Play on Words Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to open the doors, the puzzle is very impo

Play on Words UVA 10129 (有向图的欧拉路)

说说: 这道题的题意很简单,就是给你一些单词,问是否能形成一个句子,使前一个单词的最后一个字母等于后一个单词的第一个字母.本质上来说就是有向图的欧拉路问题,当然存在欧拉回路也是OK的.一开始的时候,我以为存在欧拉路只需判断两种情况:一,是存在欧拉回路,即每个节点的入度等于出度.二,存在欧拉路,有且仅有一个节点的入度比出度大一,一个节点的出度比入度大一.只要满足任意其中一种情况即可.事实上不是这样的,其实还需要判断该图是否连通.这自然而然就想到了并查集的思想.当出现两个节点的时候,将其中的一个节点

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路,问需要走几次才能将所有的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边只能走一次,且要遍历所有的边,简单的说就是一笔画(图连通) 这道题是无向图的欧拉路,无向图的欧拉路的判定:所有点的度数都是偶数度,或者只有两个点的度是奇数度,且图要是连通图 知道欧拉路是什么后,这题就比较好做了,第一件事就是找到有几个连通块,然后再判断一下每个连通块需要几笔才能完成就好了 #include <cs

POJ 2337 欧拉路

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11214   Accepted: 2908 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

欧拉路&amp;&amp;欧拉回路 概念及其练习

欧拉路: 如果给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,这条路称为欧拉路: 如果给定无孤立结点图G,若存在一条回路,经过图中每边一次且仅一次,那么该回路称为欧拉回路. 存在欧拉回路的图,称为欧拉图. 一. 对于无向图G,具有一条欧拉路,当且仅当G是连通的,且有零个或两个奇数度结点. 且有零个奇数度结点,存在欧拉回路:有两个奇数度结点,存在欧拉路. 判断无向图G是否连通,可以从任意结点出发,进行深度优先遍历,如果可以遍历到所有点,也可以用并查集,判断根节点的个数, 说明,图G连通

欧拉路,欧拉回路小结(转)

欧拉路,欧拉回路小结 把欧拉路和欧拉回路做一个小总结,包含了一些题目,以后遇到新的我还会陆续加上. 定义: 给定无孤立结点图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在 一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 关于欧拉路和欧拉回路定义及存在证明请看这里. 这里给出欧拉路和欧拉回路存在条件的结论: 存在欧拉路的条件: 无向图:  图连通,所有点都是偶数度,或者只有两个点是奇数度.当所有点是偶数度时欧拉路起点可以是任意 点:当

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