信息学奥赛一本通-第4章--第1-2节-图论算法(C++版).ppt
《信息学奥赛一本通-第4章--第1-2节-图论算法(C++版).ppt》由会员分享,可在线阅读,更多相关《信息学奥赛一本通-第4章--第1-2节-图论算法(C++版).ppt(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章 图论算法第一节 基本概念一、什么是图?很简单,点用边连起来就叫做图,严格意义上讲,图是一种数据结构,定义为:graph=(V,E)。V是一个非空有限集合,代表顶点(结点),E代表边的集合。二、图的一些定义和概念(a)有向图:图的边有方向,只能按箭头方向从一点到另一点。(a)就是一个有向图。(b)无向图:图的边没有方向,可以双向。(b)就是一个无向图。结点的度:无向图中与结点相连的边的数目,称为结点的度。结点的入度:在有向图中,以这个结点为终点的有向边的数目。结点的出度:在有向图中,以这个结点为起点的有向边的数目。权值:边的“费用”,可以形象地理解为边的长度。连通:如果图中结点U,V之间
2、存在一条从U通过若干条边、点到达V的通路,则称U、V 是连通的。回路:起点和终点相同的路径,称为回路,或“环”。完全图:一个n 阶的完全无向图含有n*(n-1)/2 条边;一个n 阶的完全有向图含有n*(n-1)条边;稠密图:一个边数接近完全图的图。稀疏图:一个边数远远少于完全图的图。强连通分量:有向图中任意两点都连通的最大子图。右图中,1-2-5构成一个强连通分量。特殊地,单个点也算一个强连通分量,所以右图有三个强连通分量:1-2-5,4,3。 1 2 3 4 5 (a) 1 2 3 4 5 (b) 1 2 3 4 5 三、图的存储结构1.二维数组邻接矩阵存储定义int G101101;Gi
3、j的值,表示从点i到点j的边的权值,定义如下:上图中的3个图对应的邻接矩阵分别如下: 0 1 1 1 0 1 1 5 8 3G(A)= 1 0 1 1 G(B)= 0 0 1 5 2 6 1 1 0 0 0 1 0 G(C)= 8 2 10 4 1 1 0 0 10 11 3 6 4 11 下面是建立图的邻接矩阵的参考程序段:#includeusing namespace std;int i,j,k,e,n;double g101101;double w;int main() int i,j; for (i = 1; i = n; i+) for (j = 1; j e; for (k = 1
4、; k i j w; /读入两个顶点序号及权值 gij = w; /对于不带权的图gij=1 gji = w; /无向图的对称性,如果是有向图则不要有这句! return 0;建立邻接矩阵时,有两个小技巧:初始化数组大可不必使用两重for循环。1)如果是int数组,采用memset(g, 0 x7f, sizeof(g)可全部初始化为一个很大的数(略小于0 x7fffffff),使用memset(g, 0, sizeof(g),全部清为0,使用memset(g, 0 xaf, sizeof(g),全部初始化为一个很小的数。 2)如果是double数组,采用memset(g,127,sizeof
5、(g);可全部初始化为一个很大的数1.38*10306,使用memset(g, 0, sizeof(g)全部清为0.2.数组模拟邻接表存储图的邻接表存储法,又叫链式存储法。本来是要采用链表实现的,但大多数情况下只要用数组模拟即可。以下是用数组模拟邻接表存储的参考程序段:#include using namespace std;const int maxn=1001,maxm=100001;struct Edgeint next; /下一条边的编号 int to; /这条边到达的点 int dis; /这条边的长度 edgemaxm;int headmaxn,num_edge,n,m,u,v,d
6、;void add_edge(int from,int to,int dis) /加入一条从from到to距离为dis的单向边 edge+num_edge.next=headfrom;edgenum_edge.to=to;edgenum_edge.dis=dis;headfrom=num_edge;int main()num_edge=0;scanf(%d %d,&n,&m); /读入点数和边数for(int i=1;i=m;i+) scanf(%d %d %d,&u,&v,&d); /u、v之间有一条长度为d的边 add_edge(u,v,d);for(int i=head1;i!=0;i=
7、edgei.next) /遍历从点1开始的所有边 /./.return 0;两种方法各有用武之地,需按具体情况,具体选用。第二节 图的遍历一、深度优先与广度优先遍历从图中某一顶点出发系统地访问图中所有顶点,使每个顶点恰好被访问一次,这种运算操作被称为图的遍历。为了避免重复访问某个顶点,可以设一个标志数组visitedi,未访问时值为false,访问一次后就改为true。图的遍历分为深度优先遍历和广度优先遍历两种方法,两者的时间效率都是O(n*n)。1.深度优先遍历深度优先遍历与深搜DFS相似,从一个点A出发,将这个点标为已访问visitedi:=true;,然后再访问所有与之相连,且未被访问过
8、的点。当A的所有邻接点都被访问过后,再退回到A的上一个点(假设是B),再从B的另一个未被访问的邻接点出发,继续遍历。例如对右边的这个无向图深度优先遍历,假定先从1出发程序以如下顺序遍历:125,然后退回到2,退回到1。从1开始再访问未被访问过的点3 ,3没有未访问的邻接点,退回1。再从1开始访问未被访问过的点4,再退回1 。起点1的所有邻接点都已访问,遍历结束。 1 2 3 4 5 下面给出的深度优先遍历的参考程序,假设图以邻接表存储void dfs(int i) /图用数组模拟邻接表存储,访问点i visitedi = true; /标记为已经访问过 for (int j = 1; j =
9、numi; j+) /遍历与i相关联的所有未访问过的顶点 if (!visitedgij) dfs(gij); 主程序如下:int main() memset(visited,false,sizeof(visited); for (int i = 1; i = n; i+) /每一个点都作为起点尝试访问,因为不是从任何 /一点开始都能遍历整个图的,例如下面的两个图。 if (!visitedi) dfs(i); return 0; 1 2 3 4 5 以3为起点根本不能遍历整个图这个非连通无向图任何一个点为起点都不能遍历整个图 1 4 5 2 3 2.广度优先遍历广度优先遍历并不常用,从编程复
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 奥赛一 算法 C+
限制150内