现在距离第一届机房病毒杯的举行(2008年11月9日)已经过去了将近一年的时间。我也顺利获得了当年的NOIP一等奖,现在我以文化课作为主要努力方向。
为了更好的造福广大OIer,我决定逐渐公开和整理一些OI资料,于是就从《第一届机房病毒杯NOIP提高组模拟赛》开始吧。因为这是第一届(或许是最后一届?)我自己主办的NOIP比赛,所以具有一定的纪念意义。值得说明的是,当初这届比赛就是为了模拟NOIP,所以难度很低。
[...]
| ||||||
现在距离第一届机房病毒杯的举行(2008年11月9日)已经过去了将近一年的时间。我也顺利获得了当年的NOIP一等奖,现在我以文化课作为主要努力方向。 为了更好的造福广大OIer,我决定逐渐公开和整理一些OI资料,于是就从《第一届机房病毒杯NOIP提高组模拟赛》开始吧。因为这是第一届(或许是最后一届?)我自己主办的NOIP比赛,所以具有一定的纪念意义。值得说明的是,当初这届比赛就是为了模拟NOIP,所以难度很低。 [...] 有向图的强连通分量 深度优先遍历是求有向图的强连通分量的一个有效方法,具体求解步骤如下: ⑴ 在有向图中,从某个顶点出发进行深度优先遍历,并按其所有邻接点的访问都完成(即出栈)的顺序将顶点排列起来。 ⑵ 在该有向图中,从最后完成访问的顶点出发,沿着以该顶点为头的弧作逆向的深度优先遍历,若此次遍历不能访问到有向图中所有顶点,则从余下的顶点中最后完成访问的那个顶点出发,继续作逆向的深度优先遍历,依次类推,直至有向图中所有顶点都被访问到为止。 ⑶ 每一次逆向深度优先遍历所访问到的顶点集便是该有向图的一个强连通分量的顶点集,若仅作一次逆向深度优先遍历就能访问到图的所有顶点,则该有向图是强连通图。 例如对图6-3(a)所示有向图,从顶点v1出发作深度优先遍历,在访问顶点v2后,顶点v2不存在未访问的邻接点从而成为一个“死结点”,如图(b) 所示。将v2从栈顶弹出后,再从顶点v1出发,在访问顶点v3 v4后,顶点v4不存在未访问的邻接点从而也成为“死结点”,如图(c)所示。将v4从栈顶弹出后,顶点v3不存在未访问的邻接点从而也成为“死结点”, 将v3从栈顶弹出后,顶点v1不存在未访问的邻接点从而也成为“死结点”,将v1从栈顶弹出,所以,得到出栈的顶点序列为v2, v4, v3, v1;再从最后一个出栈的顶点v1出发作逆向的深度优先遍历(逆着有向边的箭头方向),得到一个顶点集{ v1, v3, v4},如图(d)所示;再从顶点v2出发作逆向的深度优先遍历,得到一个顶点集{v2},如图(e)所示。这就是该有向图的两个强连通分量的顶点集。 本解题报告版权归 Ceeji,转载请保留出处和本注释。 问题描述 原始生物的遗传密码是一个自然数的序列K=(a1,…,an)。原始生物的特征是指在遗传密码中连续出现的数对(l,r),即存在自然数i使得l=ai且r=ai+1。在原始生物的遗传密码中不存在(p,p)形式的特征。 求解任务: 请设计一个程序: •从文件PIE.IN中读入一系列的特征。 •计算包含这些特征的最短的遗传密码。 •将结果写到文件PIE.OUT中。 输入: 在输入文件PIE.IN的第一行是一个整数n ,表示特征的总数。在接下来的n行里,每行都是一对由空格分隔的自然数l 和r ,1 <= l,r <= 1000。数对(l, r)是原始生物的特征之一。输入文件中的特征不会有重复。 输出: 输出文件PIE.OUT的唯一一行应该包含一个整数,等于包含了PIE.IN中所有特征的遗传密码的最小长度。 样例输入: 12 2 3 3 9 9 6 8 5 5 7 7 6 4 5 5 1 1 4 4 2 2 8 8 6 样例输出: 15 注: PIE.IN中的所有特征都包含在以下遗传密码中: (8, 5, 1, 4, [...] 欧拉回路 【定义】 图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 具有欧拉回路的图称为欧拉图(简称E图)。 【相关结论】 定理: 一个无向图是欧拉图,当且仅当该图所有顶点度数都是偶数或只有两个定点的度数为奇。 一个有向图是欧拉图,当且仅当该图所有顶点度数都是0。 求欧拉回路的一种解法 下面是无向图的欧拉回路输出代码:注意输出的前提是已经判断图确实是欧拉回路。 int num = 0;//标记输出队列 int match[MAX];//标志节点的度,无向图,不区分入度和出度 void solve(int x) { if(match[x] == 0) Record[num++] = x; else { for(int k =0;k<=500;k++) { if(Array[x][k] !=0 ) { Array[x][k]–; Array[k][x]–; match[x]–; match[k]–; solve(k); } } Record[num++] = x; } } 注意record中的点的排列是输出的到序,因此,如果要输出欧拉路径,需要将record倒过来输出。 求欧拉回路的思路: 循环的找到出发点。从某个节点开始,然后查出一个从这个出发回到这个点的环路径。这种方法保证每个边都被遍历。如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。这样直至所有的边都被遍历。这样,整个图就被连接到一起了。 具体步骤: 1。如果此时与该点无相连的点,那么就加入路径中 2。如果该点有相连的点,那马就列一张表,遍历这些点,知道没有相连的点。 3。处理当前的点,删除走过的这条边,并在其相邻的点上进行同样的操作,并把删除的点加入到路径中去。 [...] 【本文由 Ceeji 原创,转载请注明出处并保留本注释。】 Bellman-Ford算法(根据发明者 Richard Bellman 和 Lester Ford 命名)是求解单源最短路径问题的一种算法。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。 单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。 与迪杰斯特拉算法,(另一种著名的求最短路径的算法)不同的是,在 Bellman-Ford 算法中,路径的权值可以为负数。 设想从我们可以从图中找到一个环路(即从v出发,经过若干个点之后又回到v)且这个环路中所有路径的权值之和为负。那么通过这个环路,环路中任意两点的最 短路径就可以无穷小下去。如果不处理这个负环路,程序就会永远运行下去。 而Bellman-Ford算法具有分辨这种负环路的能力。 算法描述 设G为加权有向图 V是所有结点的集合 E是所有路径的集合 S表示源点 n表示V中所有结点的数目 weight(u,v)表示从结点u到结点v的路径的权值。 Distanz(v)表示从源点s出发到结点v的最短路径的距离,(或者说是从s到v所有的路径中权值的最小值)。【Predecessor(v)表示节 点v的父结点。】在Bellman-Ford算法结束之后,可以输出,G是不是包含一个负环路。如果G不包含负环路,那么Distanz就存储了从s出发 到所有结点的距离。 Bellman-Ford 算法是 SPFA 算法的基础算法。SPFA 算法是 Bellman-Ford 算法的加强版,时间复杂度和适用面都优于 Dijkstra 算法。设G = (V,E,W) 为某一有向带权图(W 即 weight,权值),s,t 分别代表源点和终点,Distance(v) 代表 v 在算法当前阶段中暂定的从源点出发的最短权和,则算法的核心思想是进行至多 |V|-1 次的迭代处理,每次从 s 出发扩展一层路径,逐渐逼近最短路径。 [...] | ||||||
Copyright © 2012 笃志以砺,决起而飞 - All Rights Reserved. LOVE YOU FOREVER. Powered by WordPress & Atahualpa 40 queries. 0.281 seconds. |
||||||
近期评论