poj 1386 Play on Words(有向图欧拉回路)

简介:

/*
  题意:单词拼接,前一个单词的末尾字母和后一个单词的开头字母相同
  思路:将一个单词的开头和末尾单词分别做两个点并建一条有向边!然后判断是否存在欧拉回路或者欧拉路 

  再次强调有向图欧拉路或欧拉回路的判定方法:
(1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度。
(2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1、v的入度比出度小1,
   其它所有顶点的入度等于出度(顶点u,v的个数必须都是1)。
   
   求该图的连通性的时候,只要求该有向图是弱连通的就可以了!所以转换为无向图的连通问题! 
*/ 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

int g[30][30];
char ch[1005];
int vis[30], used[30];
int inD[30], outD[30];

void dfs(int u){
   vis[u]=1;
   for(int i=0; i<26; ++i)
      if(g[u][i] && !vis[i])
         dfs(i);
} 

bool checkDeg(){
    int inOut=0, outIn=0;
    for(int i=0; i<26; ++i)
       if(used[i] && inD[i]-outD[i]!=0){
          if(inD[i]-outD[i]>1 || inD[i]-outD[i]<-1) return false;
          else inD[i]-outD[i]>0 ? ++inOut : ++outIn; 
       }
    return (inOut==1 && outIn==1) || (inOut==0 && outIn==0);
}

int main(){
    int n, t;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        memset(vis, 0, sizeof(vis));
        memset(used, 0, sizeof(used));
        memset(g, 0, sizeof(g));
        memset(inD, 0, sizeof(inD));
        memset(outD, 0, sizeof(outD)); 
        while(n--){
           scanf("%s", ch);
           int u=ch[0]-'a', v=ch[strlen(ch)-1]-'a';
           g[u][v]=g[v][u]=1;//无向图的连通性 即是有向图的弱连通 
           used[u]=used[v]=1;
           ++inD[v];
           ++outD[u];
        }
        bool flag=true;
        for(int i=0; i<26; ++i)
           if(used[i]){
              dfs(i);
              break;
           }
        for(int i=0; i<26; ++i)
           if(used[i] && !vis[i]){
              flag=false;
              break;
           }
        if(flag && !checkDeg())
           flag=false;
        if(flag)
           printf("Ordering is possible.\n"); 
        else printf("The door cannot be opened.\n");
    }
    return 0;
}

目录
相关文章
|
12月前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
1835 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
存储 监控 安全
在Linux中,什么是无盘工作站?并且如何在Linux中配置它。
在Linux中,什么是无盘工作站?并且如何在Linux中配置它。
|
存储 Prometheus 并行计算
10倍性能提升-SLS Prometheus 时序存储技术演进
本文将介绍近期SLS Prometheus存储引擎的技术更新,在兼容 PromQL 的基础上实现 10 倍以上的性能提升。同时技术升级带来的成本红利也将回馈给使用SLS 时序引擎的上万内外部客户。
158930 7
|
消息中间件 NoSQL 关系型数据库
一文彻底搞定Redis与MySQL的数据同步
【10月更文挑战第21天】本文介绍了 Redis 与 MySQL 数据同步的原因及实现方式。同步的主要目的是为了优化性能和保持数据一致性。实现方式包括基于数据库触发器、应用层双写和使用消息队列。每种方式都有其优缺点,需根据具体场景选择合适的方法。此外,文章还强调了数据同步时需要注意的数据一致性、性能优化和异常处理等问题。
2694 0
|
小程序 C++
Easyx趣味编程7,鼠标消息读取及音频播放
Easyx趣味编程7,鼠标消息读取及音频播放
344 0
|
编译器 开发工具 C语言
Keil软件使用及流水灯设计介绍
Keil软件是一种常用的嵌入式系统开发工具,主要用于C51单片机的编程和调试。下面将介绍Keil软件的使用和流水灯设计。 一、Keil软件的安装和配置 1. 下载Keil软件:首先需要从Keil官网下载Keil软件的安装包,然后运行安装包进行安装。 2. 配置目标设备:安装完成后,需要配置目标设备,选择对应的单片机型号和开发板。 3. 配置编译器:在Keil软件中,可以选择使用C语言编译器或汇编语言编译器,根据需要进行配置。 4. 配置调试器:如果需要进行调试,还需要配置调试器,选择对应的调试器型号和连接方式。 二、Keil软件的界面和功能介绍 1. 工程管理器:Keil软件的工
394 0
|
存储 缓存 Prometheus
Spring Boot 青睐的数据库连接池HikariCP为什么是史上最快的?
Spring Boot 青睐的数据库连接池HikariCP为什么是史上最快的?
|
存储 数据可视化 Linux
好教程推荐系列:Git教程/Git可视化客户端/GitLab虚拟机
好教程推荐系列:Git教程/Git可视化客户端/GitLab虚拟机
518 0
好教程推荐系列:Git教程/Git可视化客户端/GitLab虚拟机