《算法入门经典-训练指南》小记(慢慢填。)

来源:互联网 发布:eclipse端口号在哪改 编辑:程序博客网 时间:2024/06/16 12:01

第五章——图论算法与模型

UVA - 11624 Fire!

思路:简单宽搜

UVA - 10047 The Monocycle

思路:简单宽搜,注意保存的状态应该有思维。

UVA - 10054 The Necklace

题意:
n个珠子,每个珠子的两半由不同的颜色组成。 只有相同的颜色才能接在一起, 问能否组成一个一个项链。
思路:
欧拉回路。记录路径的时候->用dfs消圈即可。

UVALive - 4255 Guess

题意:
对于一个序列,我们可以计算出一个符号矩阵,其中Sij为ai+…+aj的正负号,现在给你一个矩阵的上三角,求一个满足的序列
思路:
经典问题。处理大于小于关系,用有向图连边,等于关系用并查集处理。

UVALive - 3523 Knights of the Round Table

题意:
有n个骑士经常举行圆桌会议,每次圆桌会议至少要有3个骑士参加(且每次参加的骑士数量是奇数个),且所有互相憎恨的骑士不能坐在圆桌旁的相邻位置,问有多少个骑士不可能参加任何一个会议。n1000
思路:
问题可以转化成“求不在任意一个简单奇圈上的结点个数”。判断奇圈通过二分染色。“一个无向图是二分图的充要条件是无奇圈”。注意一下边双联通统计出来的连通分量,会有公共点,所以每次judge一个连通分量的时候,才给它们的bccno赋值。才能保证二分染色判断的正确。

UVALive - 5135 Mining Your Own Business

题意:
有N个矿井 ,由一些隧道连接起来,现在要在矿井修建尽量少的安全通道,使得任意删除一个矿井,所有人均能逃出,求建的最少的安全通道数量和方案数。
思路:
对于每一个点双联通分量,我们思考。当它只有一个割点的时候,显然剩余其他点中选择一个作为安全通道,这个连通分量就安全了。如果有多个割点,显然不需要安放安全通道,均可逃生。所以前者,安全通道数++,方案数*=(size - 1)。另外需要特判一个特例。也就是整个图为一个点双联通分量的时候,答案应该是放置两个安全通道,C(n,2)的方案数。

UVALive - 4287 - Proving Equivalences

题意:
给出一个n个顶点,m条有向边的有向图。问你至少需要添加几条变才能使得整个图强联通。
思路:
scc入门题。强联通缩点,得到的答案即是新图中入度0或者出度为0的最大者。因为每次可以从出度为0的点向入度为0的点连边,最小化所需要的边的数量。

UVA - 11324 - The Largest Clique

题意:
给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以)。
思路:
强联通缩点,把两两可达的点缩成一个点,组成一个新图。新图势必是一个DAG,那么在DAG上直接dp即可。注意!!!STL的*max_element(dp+1,dp+1+n)要小心。在n==0时,begin() == end()。会返回end()。

UVALive - 3211 - Now or later

题意:
有n架飞机,每架飞机有两个可选择的着陆时间,并且每架飞机都必须要选一个时间着陆。为了安全考虑,要求两架飞机的最小着陆时间差最大,找出这个最大值。(2n2000),(t1e7)
思路:
二分着陆时间差,用2-SAT去judge。

UVALive - 3713 - Astronauts

题意:
有A、B、C3个任务分配给n个宇航员,其中每个宇航员恰好分配一个任务。假设n个宇航员的平均年龄为x,只有年龄大于x的才能领取A任务;只有年龄严格小于x的才能领取B任务,而任务C没有限制。有m对宇航员相互讨厌,因此不能分配同一任务。求出是否能找出符合的任务方案。
思路:
初看有三种状态,其实年龄超过x的,只有两种任务,小于x的也只有两种任务,那么定义xi=truexi=false为采取各自的第一种任务,或采取第二种任务。2-SAT。

UVA - 11396 - Claw Decomposition

题意:
给一个无向图,要把原图分成若干个“爪”,而每个爪都有三条边,因为题目说明了每条边只能属于一个爪。能否成功划分(n300
思路:
容易发现爪的中心和爪的边缘三个点,其实类似一个二分染色。然后emm就是一个二分染色即可。

UVA - 10765 - Doves and bombs

题意:
给n个点的无向图并且联通。问删除每一个点之后还剩多少联通分量。并挑选其中m个剩余连通分量最多的点,输出它们(mn10000
思路:
其实就是询问你,每个点上连着几个桥。跑个无向图的双联通,然后排个序输出即可。

UVA - 11294 - Wedding

题意:
思路:用xi=truexi=false来标记第i对夫妇的女方是否坐在左边(认为新娘坐在左边)。记住大白书这个2-SAT板子里:mark[2 * i] = true代表xi=false,mark[2 * i + 1] = true代表xi=true

UVA - 10972 - RevolC FaeLoN

题意:将n个点,m条边的无向图变成强连通图,最少需要加几条有向边。
思路:
边双联通缩点。度数为0的点贡献度为2,度数为1的点贡献度为1。一条边贡献度为2。所以把度数统计的贡献度/2上取整即可。

UVALive - 2664 - One-way traffic

题意:
给出n个顶点m条边,每条边有两个类型,1或者2,1代表是有向边,2代表是无向边,问对于所有的无向边来说,是否能改为有向边;使得图变为强连通图,能变为有向边的无向边输出边,类型为1;否则输出边,类型为2;
思路:
把所有的桥找出来。缩点以后,一个类DAG,对于一个双联通分量内部,dfs一下改有向边即可,对于外部桥保持双向即可。一般边双联通和强联通都是挂钩的。

阅读全文
0 0
原创粉丝点击