杭电1116--Play on Words(欧拉回路+并查集)

题意:类似于成语接龙, 不过有可能会首尾相连。

定义:
欧拉回路:每条边恰好只走一次,并能回到出发点的路径
欧拉路径:经过每一条边一次,但是不要求回到起始点

欧拉回路:--无向图-- 每个节点度数都为偶数。

--有向图-- 单方向, 每个点入度==出度。

     --混合图-- 暂时不知道。

欧拉路径:

     --无向图-- 一个无向图存在欧拉回路,当且仅当所有顶点度数为偶数 || 除了两个度数为奇数其余都为偶数。

     --有向图-- 一个有向图存在欧拉路径,当且仅当 该图所有顶点的度数为零     或者 一个顶点的度数为1,另一个度数为-1,其他顶点的度数为0。

     --混合图-- lue.

本题求解欧拉路径。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 27
using namespace std;
int p[N], in[N], out[N], vis[N], father[N];
void init()
{
    for(int i = 0; i < N; i++)
        father[i] = i;
}
int Find(int a)
{
    if(a == father[a])
        return a;
    else
        return father[a] = Find(father[a]);
}
void Mercy(int a, int b)
{
    int Q = Find(a);
    int P = Find(b);
    if(Q != P)
        father[Q] = P;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n; string s;
        scanf("%d", &n);   init();
        memset(in, 0, sizeof(in));
        memset(vis, 0, sizeof(vis));
        memset(out, 0, sizeof(out));
        for(int i = 1; i <= n; i++)
        {
            cin >> s;
            int x, y;
            x = s[0]-‘a‘;
            y = s[s.length()-1]-‘a‘;
            out[x]++; in[y]++;
            Mercy(x, y);
            vis[x] = vis[y] = 1;
        }
        int Q = 0;
        for(int i = 0; i < N; i++)
            if(vis[i] && i==father[i])
                Q++;
        if(Q != 1) // 判断是否连通;
        {
            printf("The door cannot be opened.\n");
            continue;
        }
        int K = 0;
        for(int i = 0; i < N; i++)
            if(vis[i] && in[i] != out[i])
                p[K++] = i;
        if(!K)  //成环;
        {
            printf("Ordering is possible.\n");
            continue;
        }
        if(K==2 && (out[p[0]]-in[p[0]]==1&&in[p[1]]-out[p[1]]==1 ||in[p[0]]-out[p[0]]==1&&out[p[1]]-in[p[1]]==1)) //欧拉路径判断;
        {
            printf("Ordering is possible.\n");
            continue;
        }
        printf("The door cannot be opened.\n");
    }
    return 0;
}
时间: 2024-10-11 07:11:06

杭电1116--Play on Words(欧拉回路+并查集)的相关文章

杭电1272--小希的迷宫(并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33175    Accepted Submission(s): 10210 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

hdu杭电1272 小希的迷宫【并查集】

Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路).小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路.比如下面的例子,前两个是符合条件

hdu杭电1213 How Many Tables【并查集】

Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want

hdu杭电1856 More is better【并查集】

Problem Description Mr Wang wants some boys to help him with a project. Because the project is rather complex,the more boys come, the better it will be. Of course there are certain requirements. Mr Wang selected a room big enough to hold the boys. Th

杭电 1856 More is better (并查集求最大集合)

Description Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements. Mr Wang selected a room big enough to hold the boys. The boy w

HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路.统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求.还有别忘了判断是否连通,此时用到并查集,图中所有的边

HDU1116(欧拉回路+并查集)

先用并查集来判断图是否连通,然后再根据欧拉回路的出度和入度的性质来判断是否为欧拉回路. 关键是建边,我们可以把字符串看成是一条边,首字母为出发点,尾字母为目的点,建边. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <math.

poj 2513 欧拉回路+并查集判断是否联通+Trie树

http://poj.org/problem?id=2513 最初看到 第一感觉---map  一看250000的数据量 果断放弃 然后记得以前看过,trie代替map,尤其当数据量特别大的时候 学到了: 1.Trie代替map的思想,可以在单词结尾的tree[i][tk]  这个i作为字符串对应的int值 ,当然这个int值也可以用于建立并查集 2.接上,通过并查集判断,所有的点在同一个集合图就是联通的,否则不联通,注意tree[i][tk]>0 表示是单词结尾, x=Find(x);//这句

hdoj 1116 Play on Words 【并查集】+【欧拉路】

Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5622    Accepted Submission(s): 1850 Problem Description Some of the secret doors contain a very interesting word puzzle. The team