poj2337

这道题昨天晚上开始做,今天才A。但是问题想透了, 发现其实没那么难

题目大意: 
给你一些单词,如果一个单词的末尾字符与另一个单词首字符相同,则两个的单词可以连接。问是否可以把所有单词连接起来,并且每个单词只能用一次。 
分析: 
可以把每个单词看成是一条边,单词的首尾字符看做是两个相连的点。我们可以把它看成有向图的欧拉路径问题(欧拉路径,欧拉回路不太明白的自己百度吧)。 
一个有向图含有欧拉通路,首先图是连通的,并且当且仅当该图所有顶点的入度 =出度, 或者起始顶点入度 = 出度 - 1 ,结束点 出度=入度-1, 其余点入度= 出度。明白了这些,我们的思路也就清晰啦! 
重点来啦:首先判断图是否连通的,在判断图是否存在欧拉路径,如果都符合那就找路径。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<algorithm>
using namespace std;int out[30], in[30], step[1005], pre[30];
int n, k, t, st;
char w[25];struct Edge//结构体:边, 存储了边的起点(首字符)和终点(尾字符),状态(是否走过)
{int s, e, v;char c[25];
}edge[1005];bool cmp(Edge x, Edge y)
{return strcmp(x.c, y.c) < 0 ? true : false;
}
int find(int x)//查找其父节点
{if(pre[x] != x)pre[x] = find(pre[x]);return pre[x];
}
int panduan()//判断是否图是连通的
{int fx = find(edge[1].s);for(int i = 1; i <= 26; i++){if(out[i] > 0 || in[i] > 0){if(find(i) != fx)return 0;}}return 1;
}
void path(int en)//查找路径
{for(int i = 1; i <= n; i++){if(edge[i].v == 0 && edge[i].s == en){edge[i].v = 1;path(edge[i].e);step[++k] = i;}}
}
int main()
{cin >> t;while(t--){memset(out, 0, sizeof(out));memset(in, 0, sizeof(in));memset(step, 0, sizeof(step));for(int i = 1; i <= 30; i++)pre[i] = i;scanf("%d", &n);for(int i = 1; i <= n; i++){cin >> w;int len = strlen(w);int s = w[0] - 'a' + 1;int e = w[len - 1] - 'a' + 1;edge[i].s = s;edge[i].e = e;strcpy(edge[i].c, w);edge[i].v = 0;out[s]++;in[e]++;/*如果存在欧拉路径,那么所有的点一定都连通.所有的点都在一个集合里,可以用并查集知识将所有连接的点并到一起。*/int fx = find(s);int fy = find(e);if(fx != fy)pre[fx] = fy;}sort(edge + 1, edge + 1 + n, cmp);//题目要求字典序最小输出,就先按从小到大的顺序把边(单词)排好/*st代表的是路径起点,在这里进行st = edge[1].s赋值,是应为存在两种情况:1.存在一定点出度>入度,这个点是起点。2.所有点出度= 入度, 那么从任意一点出发都可以, 为了保证字典序最小, 就从第一个单词开始*/st = edge[1].s;int i, c1 = 0, c2 = 0;for(i = 1; i <= 26; i++)//判断是否有欧拉回路
        {if(out[i] == in[i])continue;else if(in[i] == out[i] - 1) {c1++; st = i;}//起点else if(in[i] == out[i] + 1) c2++;else break;}//如果符合了连通图,并且存在欧拉通路, 就开始找路径if(i == 27 && ((c1 == c2 && c1 == 1) || (c1 == c2 && c1 == 0)) && panduan() == 1){k = 0;path(st);for(int i = n; i > 1; i--)//输出这注意点,因为是递归求的路径, 最先得到的是最后的边printf("%s.", edge[step[i]].c);printf("%s\n", edge[step[1]].c);}elseprintf("***\n");}return 0;
}

转载于:https://www.cnblogs.com/wd-one/p/4539305.html

poj2337 欧拉路径相关推荐

  1. POJ2337 欧拉路径字典序输出

    题意:       给一些单词,问是否可以每个单词只用一次,然后连接在一起(不一定要成环,能连接在一起就行). 思路:       这个题目的入手点比较好想,其实就是问欧拉路径,先说下解题步骤,然后在 ...

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

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

  3. 【图论专题】欧拉路径和欧拉回路

    A.AcWing 1123. 铲雪车(欧拉路的简单思想) 我们将这个图看成有向图,对于每输入一组数据加两条有向边,需要每条边都至少走一遍 我们先回想一下存在有向图的欧拉路径的充分必要条件 所有点的入度 ...

  4. poj 2513(欧拉路径+字典树映射)

    题目链接:http://poj.org/problem?id=2513 思路:题目还是很简单的,就是判断是否存在欧拉路径,我们给每个单词的头和尾映射序号,统计度数.对于给定的无向图,当且仅当图连通并且 ...

  5. 欧拉路径 之 poj 2513 Colored Sticks

    /* 欧拉路径 之 poj 2513 Colored Sticks欧拉路径: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.无向图存在欧拉路径 充要条件:1) 图是连通的 ...

  6. Riding the Fences USACO 3.3 欧拉路径(dfs+floodfill)

    额,我是直接dfs的思路,但是到case 5过不去了,感觉是太慢了.然后网上看题解,题目原型就是欧拉路径, 欧拉路径存在的条件是 要么点的度都是偶数,要么只有两个点的度是奇数.如果是两个点的度是奇数, ...

  7. CSP认证201512-4 送货[C++题解]:无向图欧拉路径、并查集、dfs

    题目分析 来源:acwing 分析: 无向图判断是否有欧拉路径:连通:度数为奇数的点,要么有2个,要么有0个. 如果有解,直接dfs求欧拉路径即可:只要有相连的边,就dfs遍历.当然,这里需要输出字典 ...

  8. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1185. 单词游戏:判断有向图是否存在欧拉路径、并查集

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 把每个单词看成一条边!!!首字母到尾字母的一条边,最多共有26个点(26个小写的英文字母),然后问能否把所有边串起来. 其实,对欧拉 ...

  9. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1124. 骑马修栅栏:欧拉路径、dfs

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 本题是无向图的欧拉路,要输出字典序最小的欧拉路. 如何输出字典序最小的路径? 从最小的点开始搜,这样得到的欧拉路是字典序最小的. 无 ...

最新文章

  1. checkIP.sh
  2. Exceptionless服务端+kibana部署实时日志纪要
  3. 通过6个简单的步骤在Windows上运行Apache Hive
  4. jqgrid 列表条件查询的几步关键操作
  5. 为什么要使用消息队列
  6. 利用建站快速软件包:XAMPP,构建基于winodws平台快速搭建PHP的数据库应用- kimai - 团队时间记录
  7. layui 按钮点击一次后失效_electron-vue自定义边框后点击事件失效问题
  8. python的缩进规则是什么意思_Python编程思想(2):Python主要特性、命名规则与代码缩进...
  9. Initial Audio Urban Essentials Heatup3 Expansion Mac(都市流派音色库)v1.0特别版
  10. nginx代理php不能跳转页面,nginx 解决首页跳转问题详解
  11. 三菱PLC控制步进电机(外部接线原理图)
  12. 如何在电脑端免费下载歌曲?
  13. Android原生权限管理:AppOps
  14. C++ 鼠标模拟程序
  15. 微信小程序ios版本连接不了服务器,微信小程序苹果手机IOS连接报网络错误解决方案...
  16. idea中push代码失败问题解决
  17. PYTHON 牛客刷题记录
  18. 西门子PLC能否实时无线采集多处从站模拟量数据?
  19. 一文了解SAAS开发、模板定制开发、全定制开发
  20. low-light系列:Lightening Network for Low-light Image Enhancement

热门文章

  1. linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  2. mysql主从只同步部分库或表
  3. RabbitMQ(三) ——发布订阅
  4. mysql导入的时候提示“1046-No Database selected”的解决办法
  5. SQL之 UNION ALL 和UNION
  6. Hibernate初探(二)
  7. 微信小程序实现收藏和取消收藏功能
  8. qq显示服务器连接中0x9a,打开QQ出现0x00008819错误代码的解决方法
  9. dubbo admin默认端口_Dubbo学习(四) Dubbo 从下载到编译成功
  10. Vulhub 靶场下载使用