题 意:

思 路:先要判断连通(dfs遍历,若遍历到的节点数与输入的节点数相同说明通),这是前提条件。接着根据欧拉路径相关      定理判断。

学习点:欧拉路径

定理一、

有限图 G 是链或圈的充要条件是:G为连通图,且其中奇顶点的数目等于0或者2。有限连通图 G 是圈当且仅当它没有奇顶点;

定理二、

如果有限连通图 G 有 2k 个奇顶点,那么它可以用 k 笔画成,并且至少要用 k 笔画成。

源代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 27 int vis[MAXN], nMap[MAXN][MAXN]; int inDegree[MAXN], outDegree[MAXN], isUsed[MAXN]; int nFlag, nNum, nCnt, nodeNum; void dfs(int u); void funcInit(); void funcInput(); void funcSolve(); void funcOutput(); int main() { int nCase; scanf("%d", &nCase); while (nCase--) { funcInit(); funcInput(); funcSolve(); funcOutput(); } return 0; } void funcInit() { int i; nodeNum = 0; nCnt = 0; nFlag = 1; memset(nMap, 0, sizeof(nMap)); for (i = 0; i != MAXN; ++i) { vis[i] = 0; inDegree[i] = 0; outDegree[i] = 0; isUsed[i] = 0; } } void funcInput() { int len, f, t; char nStr[1001]; nodeNum = 0; scanf("%d", &nNum); while (nNum--) { scanf("%s", nStr); len = strlen(nStr); f = nStr[0] - 'a'; t = nStr[len-1] - 'a'; nMap[f][t] = 1; inDegree[f] ++; outDegree[t] ++; if (!isUsed[f]) { isUsed[f] = 1; nodeNum ++; } if (!isUsed[t]) { isUsed[t] = 1; nodeNum++; } } } void funcSolve() { int i; int nIndex, ca; for (i = 0; i != MAXN; ++i) { if (!isUsed[i]) continue; break; } nCnt = 1; vis[i] = 1; dfs(i); //判断连通性! if (nCnt != nodeNum) { nFlag = 0; return; } nIndex = 0; for(i = 0; i != MAXN; ++i) { if (inDegree[i] == outDegree[i]) continue; ca = abs(inDegree[i] - outDegree[i]); if (ca == 1) { nIndex ++; if (nIndex > 2) { nFlag = 0; return; } } else if (ca > 1) { nFlag = 0; return; } } if (nIndex == 1) { nFlag = 0; } } void funcOutput() { if (nFlag) printf("Ordering is possible./n"); else printf("The door cannot be opened./n"); } void dfs(int u) { int i; for (i = 0; i < 26; ++i) { if (!vis[i] && (nMap[u][i] || nMap[i][u])) { vis[i] = 1; nCnt ++; dfs(i); } } }

poj1386 Play on Words (欧拉回路)相关推荐

  1. 图论 —— 图的遍历

    [概述] 图的遍历问题是从图中某一顶点出发,系统地访问图中所有顶点,使每个顶点恰好被访问一次. 目前,图的遍历问题分为四类: 欧拉通路与欧拉回路问题:遍历完所有的边而不能有重复,即一笔画问题 中国邮递 ...

  2. poj1386(判断一个有向图是否存在欧拉回路)

    1.欧拉回路:定义:经过图(有向图或无向图)中每条边一次且仅一次并且行遍图中每个顶点的回路( 闭合的欧拉路径,即一个环,保证每条边都通过且仅通过一次). 2.问题2:判断一个图是否有欧拉路径: (1) ...

  3. [模板][持续更新]欧拉回路与欧拉路径浅析

    Luogu P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与 ...

  4. POJ - 2337 Catenyms 欧拉回路

    测试数据在这 http://acm.student.cs.uwaterloo.ca/~acm00/030125/data/ 首先在说这道题跟之前做的poj1386很像 但是多的就是要输入路径,并且是最 ...

  5. uoj 117 欧拉回路

    1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数   1.1 对于有向边---建立单向边判断 ...

  6. 图论--欧拉路,欧拉回路(小结)

    在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路.问须要走几次才干将全部的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边仅仅能走一次, ...

  7. hdu 1878 欧拉回路

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. HDU1878(判断一个无向图是否存在欧拉回路)

    1.欧拉回路:定义:经过图(有向图或无向图)中每条边一次且仅一次并且行遍图中每个顶点的回路( 闭合的欧拉路径,即一个环,保证每条边都通过且仅通过一次). 2.问题1:判断一个无向图是否有欧拉回路的充要 ...

  9. luogu P1341 无序字母对(欧拉回路应用、模板)

    整理的算法模板合集: ACM模板 目录 输出n+1个字母,使得n个字母对都在这个字符串中出现,因为是n+1个字母,所以我们可以看出来其实就是一个欧拉路径,因为字母对可以替换顺序,所以我们将每个字母对都 ...

最新文章

  1. 02_计算机科学和软件工程的区别
  2. android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称
  3. python连接数据库示例(东西写得很详细,剽过来了)
  4. java提高篇(十六)-----异常(一)
  5. Hibernate @OneToMany 及 @Cascade级联操作
  6. 关于printf()与自增自减运算符结和问题
  7. 科目三场外考试易出错的环节
  8. 快速入门Web前端开发的正确姿势
  9. java 装饰流_java装饰流的使用【转】
  10. 2017-06-30
  11. 【牛客网SQL篇】SQL必知必会
  12. C语言自定义类型——位段
  13. 傅盛:认知升级三部曲
  14. Unity3D角色换装及换装编辑器
  15. 电池包IPX9K、IPX9测试目的
  16. 学习python的编程语言
  17. C++类和对象的使用之对象指针
  18. f49.in index.php,国家语言,语言代码,locale id对应表
  19. 【流媒体协议】RTMP和RTSP的区别
  20. [转载] 服务器基础知识

热门文章

  1. 我的世界最佳java_我的世界java版20W45A快照下载_我的世界java版20W45A最新快照版官方下载 v1.19.20.106651-菜鸟下载...
  2. 如何快速将电脑系统升级到Win11教学
  3. echart案例双刻度的坐标轴
  4. android ffmpeg p2p,avplayer: 一个基于FFmpeg、libtorrent的P2P播放器实现.
  5. 等级保护5个级别详细说明-行云管家
  6. 盘点NFT热门项目SAND和ATTN
  7. 1024程序员节,一句话证明你是程序员
  8. Cocos 引擎 7 岁生日,感谢有你!
  9. 计算机专业答辩委员会评语,答辩委员会评语大全
  10. CreateEvent() SetEvent() ResetEvent() 进程互斥