Play on Words(并查集+欧拉路)

转载 2015年07月07日 17:00:50


这个题目要运用到欧拉路得相关知识,并且也要并查集,题目说的是:给你n个单词,要你判断这些单词能不能首尾相连。理解题目意思后,进行转化,输入字符串,提取首位字母作为下标来表示两节点的出现,以及相对应节点入度和出度的增加,转化为并查集的应用即可。那么从可以想象一幅由首位字母节点构成的图,当且仅当图是一条欧拉回路或者欧拉通路的时候,才能满足题目的要求,至于欧拉回路和欧拉通路的判定可以总结为如下:
1)所有的点联通
2)欧拉回路中所有点的入度和出度一样。

3)欧拉通路中起点的入度 - 出度 = 1,终点的 初度 - 入度 = 1, 其他的所有点入度 = 出度;

无向图存在欧拉回路条件

  一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。

有向图存在欧拉回路条件

  一个有向图存在欧拉回路,且所有顶点的入度等于出度


这里我把单词的头作为出度单词的尾作为入度,其实都一样!


#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
const int N=30;
using namespace std;
int a[N];//记录老大是谁?
int in[N];//记录入读!
int out[N];//记录出度!
int vis[N];//记录是否访问!
int p[30];//记录头和尾
int Find(int x)
{
    int r=x;
    while(r!=a[r])
        r=a[r];
    return r;
}//这个就是找老大的函数,什么时候停止?就是当一个人的老大是他自己的时候!
void mix(int x,int y)
{
    int fx=Find(x),fy=Find(y);//首先要找到他们各自的老大
    if(fx!=fy)//如果他们的老大不相等,要合并就必须其中的一个老大向另外一个老大称老大
    {
        a[fy]=fx;
    }
}
int main()
{
    int t,n,i,f,j,l,c,b;
    string s;
    cin>>t;
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        memset(out,0,sizeof(out));
        memset(in,0,sizeof(in));
        for(i=0;i<N;i++)
        {
            a[i]=i;
        }
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>s;
            l = s.length();
            b = s[0]-'a';
            c = s[l-1]-'a';
            out[b]++;
            in[c]++;
            vis[b]=vis[c]=1;
            mix(b,c);
        }
        for(i=0,j=0,f=0;i<N;i++)
        {
            if(vis[i]&&Find(i)==i)
            {
                f++;
            }
            if(in[i]!=out[i])//出度不等于入读!
            {
                p[j++]=i;
            }
        }
        if(f>1)
        {
            cout<<"The door cannot be opened."<<endl;
            continue;
        }
        if(j==0)
        {
            cout<<"Ordering is possible."<<endl;//欧拉通路!
            continue;
        }
        if(j==2)
        {
            if((in[p[0]]-out[p[0]]==1&&out[p[1]]-in[p[1]]==1)||(in[p[1]]-out[p[1]]==1&&out[p[0]]-in[p[0]]==1))
            {
                cout<<"Ordering is possible."<<endl;//欧拉回路!
            }
            else
            {
                cout<<"The door cannot be opened."<<endl;
            }
        }
        else
        {
            cout<<"The door cannot be opened."<<endl;
        }
    }
}


UVA - 10129 - Play on Words (欧拉路+并查集)

题意: 对于给出的单词,判断能否首尾相连,变成一串。有点串珠子的感觉。 思路: 只要判断是否为欧拉路就可以得出结果。欧拉路形成的前提是所给的图是连通的,这就要用到并查集进行判断。在连通的前提下,...
  • qq_37325947
  • qq_37325947
  • 2017年08月21日 09:23
  • 54

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

Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...
  • u013634213
  • u013634213
  • 2014年11月27日 21:21
  • 485

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

Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...
  • shengweisong
  • shengweisong
  • 2014年11月14日 00:30
  • 1632

poj_1386 Play on Words(欧拉路)

Play on Words Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71...
  • CSDN515
  • CSDN515
  • 2012年07月27日 16:34
  • 365

hdu 题目1116 Play on Words(并查集 + 欧拉路)

Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...
  • u011282069
  • u011282069
  • 2013年08月05日 23:42
  • 638

poj 1386 Play on Words 【图论-欧拉路】

Play on Words Time Limit: 1000MS Memory Limit: 10000K Description Some of ...
  • xingdragon
  • xingdragon
  • 2017年04月29日 15:45
  • 106

HDU 1116 Play on Words(有向图欧拉路)

题目链接:Click here~~ 题意: 给 n 个词语,问是否能够词语接龙。 解题思路: 先用并查集找连通分量,然后根据结论来吧。 #include #include #inclu...
  • dgq8211
  • dgq8211
  • 2013年07月07日 11:20
  • 816

poj 1386 Play on Words(欧拉路判断)

Description Some of the secret doors contain a very interesting word puzzle. The team of archaeolog...
  • Misdom_Tian_Ya
  • Misdom_Tian_Ya
  • 2014年11月13日 17:27
  • 328

hdu ——1116——Play on Words(欧拉路有向图)

Problem Description Some of the secret doors contain a very interesting word puzzle. The team of ar...
  • u011470356
  • u011470356
  • 2013年10月25日 11:43
  • 454

POJ ~ 1386 ~ Play on Words (欧拉路)

题意:给你n个单词(只有小写),要求这些单词首尾相连,问你这n个单词能不能全部连起来,可以连成一条链或者连成一个环。 思路:顶点集合就是26个小写字母,用0到25来表示,每个单词的首字母到尾字母就是...
  • ZscDst
  • ZscDst
  • 2018年01月25日 18:06
  • 98
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Play on Words(并查集+欧拉路)
举报原因:
原因补充:

(最多只允许输入30个字)