当前位置: 首页 > news >正文

UVA 10129 Play on Words (欧拉通路)

本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html

题意:

  输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如:acm,malform,mouse)。每个单词最多包含 1000 个小写字母。输入中可以有重复的单词。

思路:

  把一个字母的两端开成节点,单词看成有向边,若问题有借,当且仅当图中存在欧拉通路。所有只需要判断由单词而构建的图是否存在欧拉通路,由于是有向边,所以利用有向图欧拉通路的判定就可以了。

判定条件

(1):底图是连通图

(2):可以有两个奇点,其中一个出度比入度大 1,另外一个入度比出度大1.

对于条件1,在这里用并查集判断了,条件2统计每个点的出度,入度,加以判断就行了.

代码:

#include <stdio.h>  
#include <string.h>  
#include <iostream>  
#include <math.h>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;  

const int maxV = 29;
int m;
int pre[maxV + 7];
int outdegree[maxV + 7];
int indegree[maxV + 7];

int Find(int x){return x == pre[x] ? x : pre[x] = Find(pre[x]); }//并查集的查找
void initPre(){ for(int i = 0; i <= maxV; i++) pre[i] = i; }//初始化并查集的数组

int mix(int x, int y)//并查集的合并
{
    int fx = Find(x), fy = Find(y);    
    if(fx != fy) pre[fx] = fy;    
}

bool isConnct()//判断图是否连通,即所有的点都在一个集合里面
{
    int cnt = 0;
    for(int i = 1; i <= maxV; i++)if( (outdegree[i] != 0 || indegree[i] != 0) && pre[i] == i) cnt++;
    if(cnt == 1)return true;
    return false;
}

bool isEulur()//是否存在欧拉通路
{
    int cnt = 0;
    int flag = 0;
    for(int i = 1; i <= 26; i++)
        if((outdegree[i] != 0 || indegree[i] != 0) && (indegree[i] != outdegree[i]))//判断奇点,方法不唯一。
        {
            cnt++;
            flag += (indegree[i] - outdegree[i]);
            if(flag > 1 || flag < -1) return false;
        } 
    if(cnt == 0 || cnt == 2 && flag == 0) return true;
    return false;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &m);
        initPre();
        memset(indegree, 0, sizeof(indegree));
        memset(outdegree, 0, sizeof(outdegree));
        for(int i = 1; i <= m; i++)
        {
            char word[1000 + 7];
            scanf("%s", word);
            int u = word[0] - 'a' + 1;
            int len = strlen(word);
            int v = word[len - 1] - 'a' + 1;
            mix(u, v);
            ++outdegree[u];
            ++indegree[v];
        }
        if(isEulur() && isConnct())    printf("Ordering is possible.\n");
        else                        printf("The door cannot be opened.\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Ash-ly/p/5398627.html

相关文章:

  • 数据库 -- SQL 和 NoSQL 的区别
  • 进度条(第七周)
  • JAVA中十四种常见开发工具及其特点
  • spring Thymeleaf 中文乱码 (转)
  • BZOJ4380: [POI2015]Myjnie
  • iOS开发经验总结
  • 人机交互——对搜狗输入法的评价
  • cocos2d-x-3.0 的改变,由于变得太多,一点点累积吧!
  • ThinkPHP函数详解系列
  • 通过手动创建统计信息优化sql查询性能案例
  • EmguCV(OpenCV)实现高效显示视频(YUV)叠加包括汉字
  • 如何优化sql语句
  • Android深度探索(卷1)HAL与驱动开发--读书笔记(第三章)
  • 怎么把文字设置为显示隐藏按钮
  • FCKeditor jsp配置
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 30天自制操作系统-2
  • CAP 一致性协议及应用解析
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Flannel解读
  • gulp 教程
  • LeetCode算法系列_0891_子序列宽度之和
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • yii2中session跨域名的问题
  • 关于Flux,Vuex,Redux的思考
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 双管齐下,VMware的容器新战略
  • 小程序 setData 学问多
  • 大数据全解:定义、价值及挑战
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​Python 3 新特性:类型注解
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (+4)2.2UML建模图
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (HAL库版)freeRTOS移植STMF103
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (javascript)再说document.body.scrollTop的使用问题
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (四)鸿鹄云架构一服务注册中心
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)德国人的记事本
  • **CI中自动类加载的用法总结
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Core引入性能分析引导优化
  • .Net MVC + EF搭建学生管理系统
  • .net 设置默认首页
  • .net和php怎么连接,php和apache之间如何连接
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net项目IIS、VS 附加进程调试