变形课
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 33522 Accepted Submission(s): 12017

Problem Description
呃…变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.

Input
测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.

Output
如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)

Sample Input
so
soon
river
goes
them
got
moon
begin
big
0

这道题我一开始是用dfs做的,做完后看讨论区说bfs和并查集也能做出来,所以就都试了一下,发现并查集做起来最方便。

下面附上ac代码:

并查集: (把每个单词的最后一个字母的根设为第一个字母,切记不能反着来,最后判断下m的根是不是b即可)15ms

#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define INF 0x7ffffff
#define mod 10000019
typedef long long int ll;
string s;
int parent[50];
void ini() {for(int i = 0; i <= 40; i++) {parent[i] = i;}
}
int findroot(int x) {int r = x;while(parent[r] != r) {r = parent[r];}return r;
}
void uni(int a, int b) {int aa = findroot(a);int bb = findroot(b);if(aa != bb) {parent[bb] = aa;}
}
int main() {ini();while(cin >> s) {if(s[0] == '0') {if(findroot('m' - 'a') == 'b' - 'a') {cout << "Yes." << endl;}else {cout << "No." << endl;}ini();}else {int len = s.size();uni(s[0] - 'a', s[len - 1] - 'a');}}return 0;
}

DFS:
注意初始化和要做的事之间的的先后顺序问题。 15ms

#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define INF 0x7ffffff
#define mod 10000019
typedef long long int ll;
string s;
ll cnt = 0;
char record[100000][2];
ll sgn[100000];
bool flag = false;
void dfs(char tail, int step) {if(flag) {return;}if(tail == 'm') {flag = true;return;}for(int i = 0; i < cnt; i++) {if(sgn[i] == 0 && tail == record[i][0] && i != step) {sgn[i] = 1;dfs(record[i][1], i);sgn[i] = 0;}}return;
}
int main() {while(cin >> s) {if(s[0] == '0') {memset(sgn, 0, sizeof(sgn));
//            for(int i = 0; i < cnt; i++) {
//                printf("%c %c\n", record[i][0], record[i][1]);
//            }for(int i = 0; i < cnt; i++) {if(record[i][0] == 'b') {sgn[i] = 1;dfs(record[i][1], i);if(flag == true) {break;}}}if(flag) {cout << "Yes." << endl;flag = false;} else {cout << "No." << endl;}cnt = 0;}else {int len = s.size();record[cnt][0] = s[0]; //headrecord[cnt][1] = s[len - 1]; //tailcnt++;}}return 0;
}

BFS:0ms
总结一下:

  1. 初始化别忘了熬
  2. memset的位置要注意熬
#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define INF 0x7ffffff
#define mod 10000019
typedef long long int ll;
string s;
ll cnt = 0;
struct node {char head, tail;
}record[100000];
int sgn[100000];
bool bfs() {node cur,next;queue<node>q;for(int i = 0; i < cnt; i++) {if(record[i].head == 'b') {cur.head = 'b';cur.tail = record[i].tail;memset(sgn, 0, sizeof(sgn)); // 感觉应该是放在for里面,但放在外面也能过 ? 搞不懂 sgn[i] = 1;q.push(cur);while(!q.empty()) {cur = q.front();q.pop();if(cur.tail == 'm') {return true;}for(int i = 0; i < cnt; i++) {if(sgn[i] == 0 && cur.tail == record[i].head) {sgn[i] = 1;next.head = 'b';next.tail = record[i].tail;q.push(next);}}}}}return false;
}
int main() {while(cin >> s) {if(s[0] == '0') {if(bfs()) {cout << "Yes." << endl;}else {cout << "No." << endl;}cnt = 0; //初始化别忘了熬!}else {ll len = s.size();record[cnt].head = s[0];record[cnt].tail = s[len - 1];cnt++;}}return 0;
}

HDU1181:变形课(并查集 + DFS + BFS)相关推荐

  1. HDU1181 变形课【DFS】(废除)

    新题解参见:HDU1181 变形课[DFS+关系闭包+bitset] 变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 13107 ...

  2. HDU1181 变形课【DFS+关系闭包+bitset】

    变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...

  3. hdu1181变形课dfs/bfs/并查集三种解法(java)

    题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...

  4. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  5. HDU1181:变形课 【dfs】

    变形课 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submissi ...

  6. zoj 3761 Easy billiards 并查集+dfs

    生活真是奇妙的东西,这样的题目居然能被联想到这样的算法,只能说智商不够啊. 这道题目的意思不解释了,月赛的时候我队友已经想出来了做法,但是我们最后还是没A. 题解: 1.首先将所有能连接的球连接起来, ...

  7. 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...

    hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...

  8. [COCI2017-2018#5] Pictionary(并查集+dfs)

    贼ex的一道,卡了本仙女整整7个小时orz 思路容易理解,but码力very重要orz 我愿意花五毛钱提升我的码力,换个脑子也行,不换脸这张脸生得俊俏 luogu传送door 题目 在宇宙一个不为人知 ...

  9. UVA - 208 Firetruck(并查集+dfs)

    题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...

最新文章

  1. 老板:kill -9的原理都不知道就敢到线上执行,明天不用来了
  2. lighttpd缓存配置
  3. 参与组织社区活动总结
  4. java跳槽原因_跳槽求职必看:Java程序猿面试失败的5大原因!
  5. 【通知】3月当当购书大额优惠券赠送,仅限今明两天
  6. Unix哲学,Microservices和DDD (2)
  7. Android 监听APP进入前台、后台
  8. 怎么调用系统通讯录并向被选中联系人发送短信
  9. 使用.NET Core与Google Optimization Tools实现加工车间任务规划
  10. Fuel 9.0安装的Openstack Controller节点进程整理
  11. Android仿人人客户端(v5.7.1)——点击左侧菜单栏中的Item切换视图
  12. Html5变量游戏,第三章语法、关键保留字及变量
  13. 面试系列 | 一个线程OOM,进程里其他线程还能运行么?
  14. 柳下惠_拔剑-浆糊的传说_新浪博客
  15. BTC多空互相蓄力 短期迎来激变
  16. 《可穿戴创意设计:技术与时尚的融合》一一3.4 服装中的电子装置
  17. PC端如何同时登录多个微信账号
  18. 星号下三角形python答案_Python利用for循环打印星号三角形的案例
  19. Windows 10文件浏览器多标签浏览插件
  20. MyISAM InnoDB 怎么读

热门文章

  1. bme java_本科学的生物医学工程BME,研究生可以申请什么专业?
  2. SVN “不能打开文件“.svn/lock” 权限不够”精解
  3. 【CV】RetinaNet:使用二分类类别不平衡损失 Focal Loss 实现更好的目标检测
  4. 学校头哥作业7_集合与字典(头哥作业[Python])
  5. Google财富传奇
  6. nginx处理post请求之数据转发
  7. android studio3.5教程,Android Studio 3.5新特性
  8. Python机器学习:train_test_split()划分数据集
  9. 荣耀v40轻奢版支持鸿蒙系统吗,荣耀V40轻奢版全面测评-测评详情
  10. 4G的u盘显示有文件 但是打开是空的