Hdu 1116 Play on Words

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1116

一道关于欧拉回路的题。由于刚刚接触欧拉图,所以收集了一些资料:

关于欧拉图的相关定义:

若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路

具有欧拉路径的图称为欧拉图(简称E图)。

判断欧拉路是否存在的方法:

有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。

无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。

判断欧拉回路是否存在的方法:

有向图:图连通,所有的顶点出度=入度。

无向图:图连通,所有顶点都是偶数度。

资料来源与相关参考:http://www.cnblogs.com/buptLizer/archive/2012/04/15/2450297.html

          http://www.cnblogs.com/zhourongqing/archive/2012/07/10/2585235.html

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <queue>

using namespace std;

const int MAXN = 30;
int in[MAXN]; // 对应入度
int out[MAXN]; //对应出度
int used[MAXN];
bool vis[MAXN];

int Find( int n ){
    if( n!=used[n] )
        used[n] = Find( used[n] );
    return used[n];
}

void Merge( int A, int B ){  // 合并
    int x = Find(A);
    int y = Find(B);
    if( x!=y )
        used[y] = x;
    return ;
}

int main()
{
    int T, N;
    int i,pos;
    int inJudge, outJudge;
    bool bug;
    string temp;
    cin>>T;
    while( T-- ){
        cin>>N;
        for( i=0;i<MAXN;i++ )
            used[i] = i;
        memset( in, 0, sizeof(in) );
        memset( out, 0, sizeof(out) );
        memset( vis, false, sizeof(vis) );  // 初始化
        while( N-- ){
            cin >> temp;
            pos = temp.length() - 1;
            out[ temp[0]-‘a‘ ]++;
            in[ temp[pos]-‘a‘ ]++;
            Merge( temp[0]-‘a‘, temp[pos]-‘a‘ );
            vis[ temp[0]-‘a‘ ] = vis[ temp[pos]-‘a‘ ] =true;
        }
        int counter = 0;  // 用于判断有几个图,如果大于1个,那不能满足题目要求
        for( i=0;i<=‘z‘-‘a‘;i++ )
            if( vis[i] && used[i]==i )
                counter ++;
        if( counter>1 ){
            cout << "The door cannot be opened.\n";
            continue;
        }

        inJudge = outJudge = 0;
        bug = false;
        for( i=0;i<=‘z‘-‘a‘;i++ )
            if( vis[i] ){
                if( in[i]==out[i] )
                    continue;
                else if( in[i]-out[i]==1 )
                    inJudge ++; // 有多少个入度大于出度大1
                else if( out[i]-in[i]==1 )
                    outJudge ++; // 有多少个出度比入度大1
                else
                    bug = true;
            }
        if( bug ){
            cout << "The door cannot be opened.\n";
            continue;
        }
        if( inJudge==1 && outJudge==1 ){
            cout << "Ordering is possible.\n";
            continue;
        }
        if( !inJudge && !outJudge ){
            cout << "Ordering is possible.\n";
            continue;
        }
        cout << "The door cannot be opened.\n";
    }
    return 0;
}
时间: 2024-10-25 07:36:50

Hdu 1116 Play on Words的相关文章

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

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

Play on Words HDU - 1116 (并查集 + 欧拉通路)

Play on Words HDU - 1116 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 important for us. There is a

HDU 1116

http://acm.hdu.edu.cn/showproblem.php?pid=1116 判断有向图欧拉回路和欧拉通路 有向图: 欧拉回路:图联通,所有顶点出度等于入度(通过图中每条边且只通过一次,并且经过每一顶点的回路.) 欧拉通路:图联通,除起点终点所有顶点出度等于入度,起点的出度-入度=1,终点的入度-出度=1(通过图中每条边且只通过一次,并且经过每一顶点的通路.) 图联通均用并查集判断 #include <iostream> #include <cstdio> #inc

HDU 1116 Play on Words (歐拉迴路 + 并查集)

鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Problem Description 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, th

hdu 1116 敌兵布阵(树状数组区间求最值)

题意: 给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j). 输入: 首行输入一个t,表示共有t组数据. 接下来每行首行输入一个整数n,表示共有n个数字. 接下来每行首先输入一个字符串,如果是”Add”,接下来是两个整数a,b,表示给第i个数增加b.如果是”Query”,接下来是两个整数a,b,表示查询从第i个数到第j个数之间的和.如果是”End”,表示这组数据结束. 输出: 每组数据首先输出”Case X: ”,其中X表示第x组数. 每次查询,输出计算结

hdu 1116 Play on Words(欧拉通路)

Problem Description 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 important for us. There is a large

hdu 1116 并查集和欧拉路径

---恢复内容开始--- 把它看成是一个图 只是需要欧拉路径就可以了 首尾能连成一条线即可 如果要判断这个图是否连通 得用并查集 在hrbust oj里面看答案学到的方法 不用各种for循环套着判断能否循环 只需要在union的时候做做调整 让比较大的父亲节点的父亲节点等于小的父亲节点 向1靠拢就可以 但是在这里面 是向出现过的最小的字母的排序靠拢 所以要记录 而且for循环26个字母的时候 只对出现过的字母做判断它是否与最小的字母可以连通 #include<stdio.h> #include

hdu 1116(并查集+欧拉路径)

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

hdu 1116 Play on Words 欧拉路径+并查集

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