随笔分类 - bfs
hdu 4607 Park Visit
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4607先求树的直径 方法:两遍bfs ,任选一点 a 求到a点最远的一点b ,然后 求到b点最远点 c这样 b和c之间的路径为 树的直径然后讨论假设直径上的点个数为 k 要访问的点个数为 v1)如果vk 首先还是要走直径 但是 m=v-k 这m个点要到其他枝叶上访问 一共要花费 2*m代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#includ
阅读全文
hdu 4536 XCOM Enemy Unknown
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4536细节很重要呀 一个小的地方错了 检查了N久呀 鄙视自己代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<set>#include<vector>#include<stack>#include<queue>using namespace std;const int M
阅读全文
1544. Classmates 3
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1544bfs代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<vector>#include<stack>#include<set>#include<map>#include<queue>#include<deque>#include
阅读全文
1569. Networking the “Iset”
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1569枚举每一个点为起点 进行广搜 比较每次搜到的树 选择最优的一种结果代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<vector>#include<stack>#include<set>#include<map>#include<queue>
阅读全文
1580. Dean's Debts
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1580简单题 对于每个联通块进行搜索 必须所以连通块都可以求出解 才可以对于某个联通块 可以设起点为 a[]+b[]*x (0+1*x) 然后不断搜索 搜到没有搜到的计算这个点的a[]+b[]*x 如果搜到已经搜过的 如果b[i]+b[j]等于0 则看a[i]+a[j]是否符合所给的边 不符合则无解否则求出 x 的值 如果一个连通块中多次求得 x 的值 则每次必须一样代码:#include<iostream>#include<cstdio>#include<cstr
阅读全文
1888. Pilot Work Experience
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1888先分成几个连通块 然后枚举每个点为起点 计算它所在的连通块以它为起点得到的差(可能不存在)然后更新此连通块的最大差如果某个连通块的最大差 不存在 则无解如果每个连通块的最大差都存在 则需要分两种情况如果只有一个连通块 则这个连通块的最大差就是最终的最大差如果有多个连通块 则最大差就是49 因为每个联通块的起点不确定代码:#include<iostream>#include<cstdio>#include<cstring>#include<strin
阅读全文
1434. Buses in Vasyuki
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1434将每一条线路 看成一个点 有共同站点的线路连一条边 并记录是那个共同站点 由于可能有多个共同站点 为了节约内存 应该避免建重边拥有出发站点的线路可以作为搜索的起点 拥有终点站点的线路可以是搜索的终点 这样的话用来搜索起点和终点就有多个了然后一遍bfs 最先搜到的终点 为最近 然后注意记录路径代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#includ
阅读全文
1250. Sea Burial
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1250最外层加上一层‘#’ 然后将island 和 sea 一层层的分离 如果某一层向外接触的 fragment 全是被诅咒的 那么这种被诅咒是会传递到这一层的代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<vector>#include<stack>#include<se
阅读全文
1905. Travel in Time
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1905把某个星球的某个时间 作为一个点 进行建图 由于时间可以等待 所以同一个星球的相邻时间也要加边最后dfs bfs 都可以了 刚开始一直TLE 原来是vector 没用好 在记录路径的时候一直在0位置插入 结果时间复杂度太高了改成在最后位置push_back 就可以了bfs代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map&g
阅读全文
1358. Cables
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1358画一个方格阵 按一定次序 依次放节点就可以了代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<vector>#include<stack>#include<set>#include<map>#include<queue>#include&l
阅读全文
1325. Dirt
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1325在求最短路的时候 如果既可以用bfs 又可以用 spfa 那么一般bfs的效率要高 因为spfa需要多次更新 而bfs只需更新一遍比如说 在点与点之间是一单位长度的话 这时候用 bfs一遍就可以 用spfa的话有可能不止一遍但是如果点与点之间的距离不是一单位长度或者更复杂的话 bfs就不适用了 这时候就得用spfa 了用bfs的时候 用优先队列优化一下就很容易写了代码:#include<iostream>#include<cstdio>#include<cst
阅读全文
1500. Pass Licenses
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1500bfs 状态压缩 对应K N M有 1<<K 个状态代表那种类型的边用 或不用对每个状态就行bfs求解最短路 若可以搜到或者所求值一定不是最优 则包含这个状态的状态就不用求了 这个剪枝很重要代码及其注释:#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<vector>
阅读全文
1056. Computer Net
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1056求树的圆心两遍 bfs 找到直径 然后圆心有一个或两个代码:#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<vector>#include<set>#include<map>#include<string>#include<queue
阅读全文
1643. Attack of the Dark Fortress
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1643bfs 就可以 不过要注意细节思路:分别求出 ‘!’到每个点的最短路 dist1 ,‘$’到每个点的最短路 dist2 和 ‘*’到每个点的最短路 dist3然后枚举每个点 的 max(dist1+dist2)+dist3 值 求最小代码:#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include&
阅读全文
1145. Rope in the Labyrinth
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1145两次bfs 找树的直径 还有在函数里面不能定义太大的数组 否则执行不了代码:#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<vector>#include<set>#include<map>#include<string>#include&
阅读全文
hdu 3721 Building Roads
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3721题意:一棵树 选择一条边移动边的位置 使移动后任然是一棵树 要求这棵树的直径最小要移动的边一定在原来树的直径上 找到这条直径 枚举所有的边每次枚举一条边时 原来的树就变成了两个树 假设两个树的直径 半径分别为d1,r1 d2,r2 那么重新组成的树的直径应该是 d1,d2,r1+r2+此边长度 中最大的那个关于一颗树怎么找直径 首先从任意一点出发 找到其他点的距离 最远距离的那个点 一定是直径的其中一个端点 以这个端点为起点再搜一遍就找到另一个端点了代码:#include<iostream>
阅读全文
1495. One-two, One-two 2
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1495说是有dp 和 bfs 两种解法 用 dp不知道其他人怎么做的我开 int[30][1000000] 直接搜 会超内存 没想到好的方法所以还是 bfs 吧结果超时 一直以为Timus 的数据够水 不过 这个题还是超时了经过不断的优化才过的思路:广搜时记录某个模 是否已经出现 出现了则无需再次入队列 否则入队列 并记录相关信息当所有的长度在30以内的可用数全出现了时 马上停止搜索 这一步很关键 大大减少时间代码及其注释:#include <iostream>#include &l
阅读全文
poj 1184 聪明的打字员
摘要:http://poj.org/problem?id=1184bfs 但是如果不加好的优化是过不了的 好像很多人多看了一分解析 我也是很详细 下面是链接:http://blog.csdn.net/lyy289065406/article/details/6648695非常不错的解题报告我的代码 很丑:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<
阅读全文
poj 3322 Bloxorz I
摘要:http://poj.org/problem?id=3322bfs 由于状态多了 所以要多开一维数组记录状态 没有什么难度 只不过是比较繁琐ans忘了初始化 贡献了一次wa代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<set>#include<queue>#include<stack>#include<
阅读全文
poj 1465 Multiple
摘要:http://poj.org/problem?id=1465题目大意:给你一个n 再给你m 个一位整数 问用这m个数可以组合出最小的n的倍数 没有则输出 0bfs + 余数剪枝 相同余数不能出现两次m个数需要排序 才能保证最小中间可能出现大整数 要处理代码及其注释:#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#include<queue>#include<cstring>#include<set>#include<st
阅读全文
浙公网安备 33010602011771号