UVA-10129 Play on Words
2015-07-24 19:29
375 查看
题目链接: Play on Words
题目大意: a单词的末尾字母若与b单词的首字母相同,则b可接在a的后面。给出一组单词,问是否可以连成且仅连成一条线。
解题思路: 把每个单词看作一条边,则此题就变成了求图中是否存在欧拉道路的问题,由于数据量小,把每个单词都DFS一遍,找到欧拉道路输出就行了。然而一开始在建图的时候用邻接表没能解决重边的问题,最后用“朴素”的邻接矩阵就Ok了。
代码如下:
题目大意: a单词的末尾字母若与b单词的首字母相同,则b可接在a的后面。给出一组单词,问是否可以连成且仅连成一条线。
解题思路: 把每个单词看作一条边,则此题就变成了求图中是否存在欧拉道路的问题,由于数据量小,把每个单词都DFS一遍,找到欧拉道路输出就行了。然而一开始在建图的时候用邻接表没能解决重边的问题,最后用“朴素”的邻接矩阵就Ok了。
代码如下:
#include <map> #include <queue> #include <cstdio> #include <vector> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; typedef pair<int, int> P; const int inf = 0x3f3f3f3f; const int maxn = 1e5 + 15; int V, E, t, cnt; int vis[200][200], temp[200][200]; int G[200][200]; int Euler(int u){ for(int v = 'a'; v <= 'z'; v++){ if(G[u][v] && temp[u][v]){ temp[u][v]--; Euler(v); cnt++; } } } int main(){ ios::sync_with_stdio(false); string s; cin >> t; while(t--){ cin >> E; memset(vis, 0, sizeof vis); for(int i = 1; i <= E; i++){ cin >> s; G[s[0]][s.back()]++; vis[s[0]][s.back()]++; } for(int i = 'a'; i <= 'z'; i++){ cnt = 0; memcpy(temp, vis, sizeof vis); Euler(i); if(cnt == E) break; } if(cnt == E) cout << "Ordering is possible." << endl; else cout << "The door cannot be opened." << endl; } return 0; }
相关文章推荐
- Docker 生成Node.js web app(含端口映射)
- Scala 深入浅出实战经典 第39讲:ListBuffer、ArrayBuffer、Queue、Stack操作代码实战
- 中序遍历二叉树(非递归算法 c语言)
- 北航机试--矩阵替换(C语言实现)
- android的测试方法,
- android 不同手机外置SD卡路径不同
- ZOJ3436 July Number
- 如何打造专属自媒体品牌
- 杭电 2091 空心三角形
- 查看,控制进程
- org.apache.jasper.JasperException: Unable to compile class for JSP
- Deep Learning for NLP 文章列举
- LayoutParams
- Android Studio如何在真机中调试
- 递推(错排公式)
- Java Lock Condition
- 聊天--感悟
- 最长公共子序列 (LCS,longest common subsequence problem) 动态规划
- 【系统性能优化】Hibernate调优
- 时间日期类型