随笔分类 -  图论

摘要:题目: 曹操在长江上建立了一些点,点之间有一些边连着。如果这些点构成的无向图变成了连通图,那么曹操就无敌了。刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥。但是诸葛亮把所有炸弹都带走了,只留下一枚给刘备。所以刘备只能炸一条桥。 题目给出n,m。表示有n个点,m条桥。 接下来的m行每行给出a,b,c,表示a点和b点之间有一条桥,而且曹操派了c个人去守卫这条桥。 现在问刘备最少派多少人去炸桥。 如果无法使曹操的点成为多个连通图,则输出-1. 思路: 就是用tarjan算法算出桥的数量,再比较哪一个的值最小。Tips: 注意三点: ①. 有重边,所以tarjan算法要处理重边... 阅读全文
posted @ 2013-11-20 13:40 Griselda. 阅读(1788) 评论(0) 推荐(0) 编辑
摘要:题意: 安排计划,有4种约束方式,给出你这些时间的n个约束.. 如果计划是可行的,求出每一件事发生的最早时间..否则输出“impossible”.. ①. FAF a b a要在b完成后完成.. ②. FAS a b a要在b开始前完成.. ③. SAS a b a要在b开始前开始.. ④. SAF a b a要在b结束前开始..思路: 简述 差分约束系统.. 差分约束系统就是给出一个不等式组..每个不等式形如 xj-xi <= bk bk是一些已知的常量.. 求出所有未知量xi.. ***---要注意是小于等于---*** 其实差分约束系统就像是最短路中的松弛条... 阅读全文
posted @ 2013-06-06 21:31 Griselda. 阅读(582) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一个n*m的矩阵, 0 表示不可走 1 表示可走 2 表示起点 3 表示终点 4 表示可走且走到这一步可以满血 某人一开始有6滴血,走一步少一滴..到0就死了.. 可以走到4的位置满血再走.. 求出最少走几步可以从起点到终点.. 思路: 广搜,用一个cnt表示现在走了几步,一个cur表示现在的血量.. 普通的广搜过程中如果已经走过就不可以再走了..但是第三个样例可以看出走过还可以再走.. 因为普通广搜走过不能再走只是代表这个状态已经访问过了..不需要再次访问,防止死循环.. 但是现在再次访问的时候因为血量已经不一样了.所以可以再走.. 剩下就是正常... 阅读全文
posted @ 2013-06-06 21:05 Griselda. 阅读(178) 评论(0) 推荐(0) 编辑
摘要:题意: dos命令的cd操作有两个可执行方法 cd .. 回到上一级目录 cd 当前目录名/b/c/d 当前目录名到某一个子目录下 给出你目录的关系,然后给出a b问最少经过几步可以从a走到b..思路: 求出a和b的最近公共祖先,然后分4种情况讨论 ①. a和b有一个公共祖先c,则用 c时间戳-a的时间戳+1(1步可以直接从c到b) ②. a是b的祖先,则只用1步就可以到达b点 ③. b是a的祖先,则用a的时间戳-b的时间戳 ④. a和b是同一个点,则答案是0Tips: 求绝对值的函数还是得自己写.. 用algorithm的就wa了.. 因为algorithm... 阅读全文
posted @ 2013-06-05 17:03 Griselda. 阅读(874) 评论(0) 推荐(0) 编辑
摘要:题意: 各国的汇率兑换.. 给出各国之间汇率兑换的比例,然后问你是否可以通过不断地兑换最后挣钱.. 譬如美金兑换英镑 是0.5 英镑兑换法币是 10 法币兑换美金是 0.21 所以通过1美金兑换成0.5英镑然后兑换成0.5*10 = 5的法币再兑换成5*0.21的美金就可以得到1.05的美金就可以挣钱了~思路: 这个跟最短路的意思其实是一样的.. 不过是看看最后的dis[1][1]是否大于1 Tips: 这题由题意可以发现最后的结果是由G[1][i]*G[i][j]*G[j][k]*..G[..][1]得到的.. 这里因为是乘运算..所以其实和最短路中的负权路是一... 阅读全文
posted @ 2013-05-20 21:05 Griselda. 阅读(196) 评论(0) 推荐(0) 编辑
摘要:题意: n个队伍,一个队伍3个人,要求如果队长不在那剩下两个队员必须在,如果剩下两个队员不在队长必须在.. m种冲突关系,每种冲突关系中的两个人不能同时存在。 问方案是否可行..思路: 2-sat..根据冲突关系连边.. 然后看某人的留和不留是否会一起发生..如果会就代表方案不可行..Tips: 总结一下2-sat.. 通常都需要拆点..拆成两种状态,选或者不选.. 然后根据题目给出的点的必然关系..即a发生b不能发生,b发生a不能发生..的关系连边.. 根据建的图进行深搜..并且染色.. 最后结果就是必须发生的关系的总关系会是一种颜色.. 最后遍历每一个点,如果该... 阅读全文
posted @ 2013-05-09 11:33 Griselda. 阅读(357) 评论(0) 推荐(0) 编辑
摘要:题意: 小A要从第一个城市出发走遍所有城市.. 但是想要尽量走少一点路.. 给出两个城市之间连接的距离..问最少需要走多少距离..思路: 如果要回到原点..最短距离相当于每一段路都走两遍.. 现在并不需要走回第一个城市..只要走遍所有城市就好.. 所以找到一条从第一个城市开始的最长的路..然后用总长度*2-最长的路.. 得到的就是最短的路了.. 求最短路可以用dfs..bfs..Tips: 深搜的时候要记得用一个vis数组.. 否则会死循环..因为是一个无向图..Code:View Code 1 #include <stdio.h> 2 #include <cstring.. 阅读全文
posted @ 2013-04-28 08:38 Griselda. 阅读(166) 评论(0) 推荐(0) 编辑
摘要:题意: 给出n个字母 问是否可以全部头尾相接,输出按字典序排列思路: 用套圈法求出欧拉回路 先把单词读入 排序保证最后结果是按字典序的 用并查集看是否连通 根据入度和出度看是否是欧拉路径,如果有必要也要找出起点 用套圈法求出欧拉路径 输出结果 Tips: ※不能用cin cout ※注意不能直接由 ansi == n 来判断是否有欧拉路径.. 而要由出度和入度的关系来判断.. 因为如果出现是出度-入度 = 1 且 入度-出度 = 1的时候要保证 出度-入度 = 1的点是起点~ 否则即使连通也不能证明存在欧拉路径.. ※用并查集检查是否连通... 阅读全文
posted @ 2013-02-01 13:16 Griselda. 阅读(271) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一棵树..求出一条路..使得别的点到这条路径的距离最长的最短..输入: n 表示树上有n个点.. u v w 表示u和v这两个相连的点的边权值为w思路: 3次广搜.. 第一次从任意一个点找最长的路径~这个路径的终点就是要求的路的终点.. 第二次从终点开始找最长的路径..这时候找到的路径就是最后的路了.. 然后从这个队列往外遍历相连的路.. 这时候找出来的最长的距离就是要求的答案.. Tips: 因为加边的时候是双向边.. 所以边的数组应该开两倍大.. pre 数组要注意~~~~Code:View Code 1 #include... 阅读全文
posted @ 2012-11-06 21:48 Griselda. 阅读(190) 评论(0) 推荐(0) 编辑
摘要:题意: 有一个牧师要给好几对新婚夫妇准备婚礼.. 已知每对新婚夫妇的有空的时间以及婚礼持续时间.. 问是否可以让每对新婚夫妇都得到该牧师的祝福~ 如果可以就输出YES以及可行解 不可以就输出NO输入: 一个n 表示有n对新婚夫妇 接下来n行每行a b c 表示在a~b这段时间有空..以及婚礼会持续 c.. P.S.时间只可以选在a开始或者b结束.. eg:08:00 09:00 30 可以在8:00~8:30举行婚礼或者8:30~9:00举行婚礼思路: 2-sat 以在前一段时间举行婚礼或者后一段时间举行婚礼为2个可选方案 然后每对新婚夫妇婚礼时间冲突了就给和另外一个方案连... 阅读全文
posted @ 2012-10-09 13:40 Griselda. 阅读(527) 评论(0) 推荐(0) 编辑
摘要:题意: panda和ikki.玩游戏.. 给出m个点对关系..这些点都在圆上.. 给点对连线..如果可以不交叉(可以在圆内或圆外连线)则panda赢..否则ikki.赢 输入: 给出n m 表示有n个点 m个点对 接下来m行 有a b 表示点a 和 点b 之间有一条线思路: 2-sat..用来解决2个集合的冲突问题.. 这道题..冲突在于是在圆内和在圆外.. 把边看成点.. 然后看所有边连起来之后会不会出现冲突..即在圆外的边和在圆内的边同时出现在一个强连通分量里了.. 所以求出强连通分量.. 看交叉的两条边..用tarjan染色.. 如果冲突出现了(在圆... 阅读全文
posted @ 2012-10-05 19:26 Griselda. 阅读(247) 评论(0) 推荐(0) 编辑
摘要:题意: 某个公园要修路..这将导致两个景点无法连通 输入: 给出n m 表示有n个景点 m条路 接下来m行每行有a b 表示a景点和b景点相连.. 问加几条边可以使任意两个景点都相连..思路: 先用tarjan算法求出每个连通分量 然后对无向图来说..变成双连通分量的方法就是(入度为1的点+1)/ 2Tips: 无视POJ的simple输入输出 都是坑人的..T0T 还有就是现在这样tarjan算法第一次调用的时候就是tarjan(1, 1)Code: View Code 1 #include <stdio.h> 2 #include <cstring> 3 #incl 阅读全文
posted @ 2012-10-05 12:09 Griselda. 阅读(185) 评论(0) 推荐(0) 编辑
摘要:题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明了哪个王子将迎娶哪个邻国的公主.. 但是调皮的国王不太满意~~ 他还想知道他的儿子分别可以迎娶哪几个公主中的一个而不会让他的兄弟因此而吃醋.. 所以宰相又得重新写清单了.. 噢..对了~邻国的公主和王子人数一样多~<这是一个奇怪的国家..> 输入: 一个n表示有n个王子.. 接下来n行每行有一个m表示第i个王子喜欢m个公主.. 然后给出m个公主的序号.. 最后一... 阅读全文
posted @ 2012-10-05 07:54 Griselda. 阅读(179) 评论(0) 推荐(1) 编辑
摘要:题意: 给出n个点和他们之间的一些关系.. 问加多少条边可以使所有的点变成强连通分量..思路: 根据题意就可以知道有这个推理: 原图缩点后的有向无环图.. 出度为0的点和入度为0的点中个数少的那些点向个数多的那些点连线.. 可以使森林变成强连通分量..Tips: 注意如果缩点后变成一个点了.. 则入度为0和出度为0的点的个数都是1 但是实际上已经是强连通分量..不需要连线了.. 所以答案应该是0Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <algorithm> 4.. 阅读全文
posted @ 2012-10-04 21:42 Griselda. 阅读(215) 评论(0) 推荐(0) 编辑
摘要:题意: 给出n个学校的兄弟学校..<单方面认为> 如果给了一个软件给某个学校..他就会把这个软件给他的兄弟学校.. 然后求两个解: 1st: 至少准备多少个软件..可以使所有的学校都有这个软件.. 2nd:至少加多少条边..可以使只给一个软件..就能让所有学校都得到这个软件..输入: 一个n 代表有n个学校.. 接下来n行.. 第i行 给出第i个学校的兄弟学校(单方面认为)的列表..以0结束.. 输出两个解的结果..思路:缩点之后把原图变成一个有向无环图.. 两个解可以看成是: 1st:把该有向无环图看成一个森林..求的就是有多少棵树..<即入度为0的根节点的个数... 阅读全文
posted @ 2012-10-04 21:09 Griselda. 阅读(185) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一些房间之间的关系 问任意两个房间是否存在一条互通的路径..即单相连通.. 输入: 给出T表示有T组数据 每组数据给出n m 表示n个房间 m个关系 接下来m行..每行给出a b 表示a房间 和 b房间之间是连通的.. 如果任意两个房间之间存在单相连通..则输出yes 否则 no思路: 先用tarjan算法求出每个强连通分量..然后对每一个进行染色.. 然后建图..拓扑排序.. 如果排序不唯一..就是有超过两个点是有0个初度的.. 这代表其中有两个房间是不相连的..Tips: 点太多或者边太多的情况下.. 就要用前向星建图了..Code:View Code... 阅读全文
posted @ 2012-10-03 21:33 Griselda. 阅读(183) 评论(0) 推荐(0) 编辑
摘要:题意:给出一些 两个门连通的关系问是否所有房间都连通输入: n m 表示n个房间 m个关系 接下来m行a b 表示房间a和房间b 相连如果房间是互通的 输出yes 否则 no思路: 用tarjan求强连通分量 <强连通分量:有向图中任意两个点存在互通的道路..>Tips: 强连通分量tarjan算法讲解:http://www.byvoid.com/blog/scc-tarjan/zh-hant/Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <algorithm&g 阅读全文
posted @ 2012-10-03 15:23 Griselda. 阅读(208) 评论(0) 推荐(0) 编辑
摘要:题意:给出一个每一格带值的矩阵每一次只可以从左上角走到右下角问走过k次后最多能得到多少值P.S 走过的格子值会变成0输入: 给出一个n 和 k 给出n*n 矩阵思路: 因为求的是最大值 所以应该求最长距离..把最小路径改成求最大路径 <相应改变的就是松弛操作 和 dis的初始状态> 为了保证每个点只取一次值 并且 可以经过多次 就进行拆点 然后对应点之间加两条边 ①. 容量为1 费用为该点的值 ②. 容量为INF 费用为0 ①边保证了该点走过后变为0值 ②边保证该点可以经过多次 还有超级源点跟每个点之间连边 容量为k 费用为0 超级汇点和每个拆点之间连边 容量为k 费用... 阅读全文
posted @ 2012-10-02 20:54 Griselda. 阅读(228) 评论(0) 推荐(0) 编辑
摘要:题意:有一种奇怪的小鱼..他会攻击他认为是女的鱼..<如果她自己也是女的呢?不懂..果然是奇怪的小鱼..>然后生下来的孩子的值等于父母值的异或结果..<更奇怪了..囧~>问最可能得到的孩子值最大是多少~输入: 一个n代表有n条鱼 接下来1行有n个数表示第i条鱼的值 然后n*n行~表示第i行的鱼认为第j行的鱼是女的鱼思路: 根据给出的n*n矩阵~ 得出第i个点对应第j个点..即ij连边的值wij.. 然后转化为求最佳匹配<最大边权匹配>Tips: 读入数据的时候要以字符串的形式.. 坦白说我到现在都没理解一个一个字符读的话为什么会wa.. 求解.. 传说.. 阅读全文
posted @ 2012-10-02 13:26 Griselda. 阅读(273) 评论(0) 推荐(0) 编辑
摘要:题意:给出m个路径的起点和终点还有长度找出一条路径可以从1到n然后回到1..并保证找到的路径是不重复而且是最短的..思路:容量控制经过只有1次费用控制长度在建完图后求最小费用最大流..就可以找出最短距离..而且没有重复路径..Tips:※ 0点作为超级源点和1相连 n+1作为超级汇点和n相连 然后容量为2费用为0 保证一进一出※ 建图的时候..相邻的正反边要紧挨着写.. 因为更改图中的容量的时候.. edge[load[u]].c -= mn; edge[load[u]^1].c += mn; 位运算表示的是反向边..所以加的时候应该紧挨着加..... 阅读全文
posted @ 2012-10-01 23:45 Griselda. 阅读(299) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示