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;
}

目录
相关文章
|
C++
在C++语言中比较两个数的大小的方法
在C++语言中比较两个数的大小的方法
3200 1
|
3月前
|
监控 Java Serverless
阿里云函数计算FC实现网站定时任务与自动化的完全指南
本文系统讲解如何利用阿里云函数计算FC实现网站定时任务与自动化。首先阐述Serverless定时任务相比传统Crontab的免运维、按需付费等核心优势,然后深入剖析定时触发器的三种配置模式(时间间隔、指定时间、自定义CRON表达式),重点说明UTC与北京时间转换及CRON_TZ时区指定技巧。接着提供Python、Node.js、Java、Golang四种主流语言的生产级代码示例,展示如何编写handler函数并处理定时事件。随后汇总日报推送、数据备份、日志转存、API健康检查、爬虫采集五大典型自动化场景,给出具体架构与实现思路。文章还详细阐述成本控制策略(内网访问、内存规格选择、闲置计费)、监
|
2月前
|
人工智能 安全 测试技术
Skill 和 MCP 到底有什么区别?哪个更适合我
本文澄清Skill与MCP本质互补:MCP是AI连接外部系统的“USB-C协议”,解决“能不能连”;Skill是AI执行任务的“操作手册”,解决“会不会做”。二者分属底层通信与上层流程,非二选一。真实场景中常需协同使用。
|
数据采集 监控 BI
零代码2小时搭建MES系统
本文介绍了如何利用零代码工具快速搭建制造执行系统(MES),解决车间计划频繁变更、数据滞后、设备问题难追溯等痛点。通过“流程→数据→规则→看板”四步法,企业可在2小时内上线核心MES功能,包括生产订单、工单执行、质量检验、设备状态、物料领用及数据看板。零代码方案具备快速验证、低成本迭代和易落地的优势,适合中小批量、多品种的制造场景,助力车间从“靠记忆”转向“靠数据”驱动,实现生产透明化与效率提升。
|
机器学习/深度学习 运维 算法
关于具身机器人的视觉机制的建立
本文提出了一种类人视觉机制的具身机器人框架,通过“目标驱动、TOKEN预设、草图生成、异常处理”四大核心步骤,在动态环境中实现高效、灵活的任务执行能力。
512 0
|
10月前
|
机器学习/深度学习 算法 安全
PAC(Probably Approximately Correct)理论简介
PAC理论(概率近似正确)由Leslie Valiant提出,是机器学习的基础理论,用于分析模型在有限数据下以高概率学会近似正确规律的条件,涵盖可学习性、样本与计算复杂度,虽具理想化假设,但仍为算法设计提供重要框架。
1517 0
|
域名解析 网络协议 索引
分享|【红猫网】备案域名的二级分发:实现网站可迁移、流量分流、备份归档
本文介绍了如何利用备案域名的二级分发技术实现网站迁移、流量分流和备份归档。通过为主域名下的子域名设置独立解析记录,实现资源的灵活分配与管理,确保网站服务的稳定性和高效性。同时,文章还解答了关于备案、SEO优化及HTTPS支持的相关问题。
2048 0
|
SQL Oracle 关系型数据库
实时计算 Flink版操作报错合集之连接器换成2.4.2之后,mysql作业一直报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
779 3
|
测试技术 数据安全/隐私保护 Docker
Docker部署开源项目Django-CMS企业内容管理系统
【5月更文挑战第20天】Docker部署开源项目Django-CMS企业内容管理系统
1079 1

热门文章

最新文章