随笔分类 -  连通分量

hdu 4635 Strongly connected
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4635我们把缩点后的新图(实际编码中可以不建新图 只是为了概念上好理解)中的每一个点都赋一个值表示是由多少个点缩成的 我们需要找所有端点 也可能出发点(只有出度) 也可能是结束点 (只有入度)这个端点和外界(其它所有点)的联通性是单向的(只入或只出) 也可能没有联通在保持这个端点与外界的单向联通性的情况下 任意加边所以当端点的值越小(包含点越少) 结果越优代码:#include#include#include#include#include#include#include#include#include#in 阅读全文
posted @ 2013-08-01 19:29 夜-> 阅读(196) 评论(0) 推荐(0) 编辑
hdu 4612 Warm up
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4612将原图进行缩点 变成一个树树上每条边都是一个桥 然后加一条边要加在树的直径两端才最优代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;typedef long 阅读全文
posted @ 2013-07-25 21:27 夜-> 阅读(246) 评论(0) 推荐(0) 编辑
1198. Jobbery
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1198英语真的是硬伤呀 读了N遍 愣是没有读懂 最后看了别人的提示反正是联通分量 缩点 然后对缩点后的图进行求解 缩点后的图必须有且仅有一个点入度为0然后输出这个入度为0的点所包含的所有原来的点 (按顺序)注意输入数据量很多 要用scanf 用cin 有可能超时代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#inclu 阅读全文
posted @ 2013-01-18 17:02 夜-> 阅读(301) 评论(0) 推荐(0) 编辑
sdut 2506 完美网络
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2506连通分量 缩点后形成新的图(不用新建也可以) 是一个森林如果缩点后是就剩一个点 则答案为 0否则 对于缩点后的某一个点 如果和它相连点(缩点后的)有大于等于2个 则无需再连如果和它相连的有一个点 则需要加一个边连接它 如果没有点和它相连 则需要加两条统计总共需要加的边的个数sum 因为每条边连接两个点 所以答案为 (sum+1)/2代码:#include<iostream>#include<cstdio>#incl 阅读全文
posted @ 2012-12-10 11:46 夜-> 阅读(226) 评论(1) 推荐(0) 编辑
1218. Episode N-th: The Jedi Tournament
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1218缩点后形成树 树的根节点 就是有可能获胜的点#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#include<map>#include<cmath>#include<queue>#include<stack>#include<algorithm>#defi 阅读全文
posted @ 2012-10-23 18:31 夜-> 阅读(253) 评论(0) 推荐(0) 编辑
1124. Mosaic
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1124连通分量 Tarjan大体题意:n个箱子 每个里面有m个物品 但对应编号有可能错误 要求把所以物品归位 求最少move一次move 有两种情况 1,把一个物品从一个箱子里拿到里一个箱子了(回来,不会来都可以) 2,空手从一个箱子到另一个箱子思路:首先每个放错的物品都得被移动一次 然后就是从一个连通分量移动到另一个连通分量(空手移动)注意移动到第一个连通分量无需花费时间 而已要注意为0的情况代码:#include<iostream>#include<cstdio>#i 阅读全文
posted @ 2012-10-23 17:10 夜-> 阅读(200) 评论(0) 推荐(0) 编辑
1742. Team building
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1742连通分量方法: 找到环 缩点 建立新图 新图是一个森林新建的的森林 有多少节点 那么就有最多多少team 有多少叶子节点 那么最少就有多少team注意由于n比较太 如果原图有一条很长的直线的话 会爆栈 所以自己开了一个栈 这种错误多次遇到 以后要注意呀代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#incl 阅读全文
posted @ 2012-10-22 21:42 夜-> 阅读(273) 评论(0) 推荐(0) 编辑
poj Road Construction
摘要:http://poj.org/problem?id=3352题目大意:给你n个旅游点 m条路已知任意两点之间直接或间接相通,两点之间最多一条直达路(没有重边)但是如果修理某一条路的话 就会使得这条路不能用,就会出现某两点不通的现象所以要再建几条路使得任意两点之间至少有两条没有公共边的路径问至少多建几条边?方法:1,缩点2,建新树3,求叶子节点注意:由于是双向边,处理起来要谨慎。假设叶子节点数时 v至于为什么最后答案是(v+1)/2 (只有一个根结点特判)我们可以这么想如果v为偶数 任意两叶子结点之间连一条边 那么这两个叶子结点到根结点的路径上的点就全在环上了 所以至少是v/2如果是v为奇数 任 阅读全文
posted @ 2012-06-04 11:52 夜-> 阅读(161) 评论(0) 推荐(0) 编辑
poj 3114 Countries in War
摘要:http://poj.org/problem?id=3114题目大意:n个间谍 他们之间传送信息需要一定的时间一个联通分量里面的间谍属于一个国家,之间的信息传递不需要时间然后问你从一个间谍传一个信息到另一个间谍那需要最少时间 也可能传不到联通缩点+最短路缩点所得到的新图 可能是因为有重边或是太稠密 用邻接表容易超时基本步骤:1,输入去重边2,Tarjan缩点3,重新调整缩点后间谍之间的信息传递时间4,最短路注意: 图有可能不完全连通代码及其注释:#include<iostream>#include<cstring>#include<stack>#includ 阅读全文
posted @ 2012-06-03 17:22 夜-> 阅读(186) 评论(0) 推荐(0) 编辑
poj 3592 Instantaneous Transference
摘要:http://poj.org/problem?id=3592每次做联通分量的题都是细节方面出错 伤不起呀一张图 有些点是有矿可走 有些不可走 有些是时空转换点矿车从左上开始走问最多能才多少矿1,把二维图变成一维 由于时空转换点的存在使图存在了环2,缩点 把环缩成一个点3,重新建树,4,搜索最多矿以后再也不在Tarjan里进行重建图了 太容易出错了果断在Tarjan后再dfs重新建图 虽然效率低了点但是不容易出错而且只要整体算法选择正确 是不会超时的由于数据小 所以dfs搜索最多矿就可以 不过要标记代码及其注释:#include<iostream>#include<cstrin 阅读全文
posted @ 2012-06-01 20:06 夜-> 阅读(215) 评论(0) 推荐(0) 编辑
poj 2186 Popular Cows
摘要:http://poj.org/problem?id=2186给你n头牛 他们之间会有一种 A认为B popular 的关系 而且这种关系是可传递的问你有多少头牛是被所有其他的牛认为popular1,缩点 将一个联通分量内的点缩成一个2,缩点同时记录联通分量内点的个数3,缩点后图变成了树 或者是 (非树)森林 如果是树 则树根连通分量内的点就是答案 如果是森林 答案为0 生成的树或森林 根方向上是被指向的。4,由于3的原因 搜索时还有注意标记哪些缩点是没有可能成为根的缩点5,如果根缩点只有一个(树) 则根就是答案 如果多个(非树森林)则为0注意 Tarjan 搜索是并不一定一次就能将所有的点搜干 阅读全文
posted @ 2012-06-01 09:53 夜-> 阅读(172) 评论(0) 推荐(0) 编辑
poj 2942 Knights of the Round Table
摘要:http://poj.org/problem?id=2942弄了一天 终于搞定伦理知识我建议看这里 http://blog.csdn.net/lyy289065406/article/details/6756821讲的很详细 不过代码的风格不是很好接受刚开始我以为是所有的骑士全围着一张桌子坐后来才知道某个骑士只要能和任意其他符合要求的骑士组成一个会议小组他就可以留下开会条件:a 骑士的数量必须是奇数而且不能是1b 他的两个邻居不是他仇恨的给出原图后建补图求点的双联通对补图每求一个割点就对其进行操作出栈操作 但是联通根点不出栈 (因为它可能属于其他的联通图)对其联通图进行遍历 对所有的奇环内的点 阅读全文
posted @ 2012-05-31 19:41 夜-> 阅读(175) 评论(0) 推荐(0) 编辑
poj 3694 Network
摘要:http://poj.org/problem?id=3694用了Tarjan bfs 缩点所以时间复杂度比较高思路 先建双向图 重边要处理(用一个变量表示边数)用Tarjan算法缩点重新建了一个缩点后的双向图增加边时用bfs 搜索路径上的桥如果还有就对数量进行操作并将此桥标记为没有每次重复#include<iostream>#include<cstring>#include<stack>#include<cstdio>#include<queue>using namespace std;const int N=100005;struc 阅读全文
posted @ 2012-05-30 22:10 夜-> 阅读(212) 评论(0) 推荐(0) 编辑
poj 1523 SPE
摘要:http://poj.org/problem?id=1523居然1A and 0ms 太让我意外了题目大意:给你几个电脑的双相连通图 问你是否存在割点 如果存在输出割点并输出此割点见原图变成了几个块输入输出只要注意就是了 没别的办法Tarjan 算法 我就不多说了 我也说不好总之用Tarjan算法找割点 但是你搜索时的根结点要特判对不每个割点用dfs求其可把原图分成几个块从割点发出可能用k个分支 那么块数 <= k对其分支进行深搜并记录 有几个分支可以向下搜 就有几个块深搜记录 可以搞定几个分支相连的情况详情见代码注释:#include<iostream>#include&l 阅读全文
posted @ 2012-05-29 17:04 夜-> 阅读(188) 评论(0) 推荐(0) 编辑
hdu 1269
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1269题目大意:给你一个迷宫 给你结点个数和一定数目的单向边问你迷宫是否强连通做这道题这是为了练习一下Tarjan算法关于这个算法网上很多而已版本 大多都一样 我就不多说了详解见代码注释#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<stack>using namespace std;const int N= 阅读全文
posted @ 2012-05-28 20:02 夜-> 阅读(168) 评论(0) 推荐(0) 编辑