暑假实习2-图论相关问题.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
暑假实习2-图论相关问题

图论相关问题 相关概念 在现实世界中许多状态是由图形来描述的。一个图是由一些结点和连接两个结点之间的连线所组成。 一个图是一个三元组V(G),E(G),φG,其中V(G)是一个非空的结点集合,E(G)称为边集,φG是从边集合E(G)到结点无序偶(有序偶)集合上的函数。 有向图:边集合E(G)是由结点的有序偶组成,即结点间的连线带箭头。 无向图:边集合E(G)是由结点的无序偶组成,即结点间的连线不带箭头; 权:如果图的边被赋予一个与它相关的数,这个数成为该边的权; 顶点的度:在无向图G=V,E中,与结点v(v∈V)关联的边数,称作是该结点的度数。在有向图中,以结点v作为终点的边数称为该结点的入度,从结点v出发的边数称为该结点的出度。结点的出度与入度之和就是该结点的度数。 子图:设图G=V,E, 如果有图 G‘,其顶点集合为G的顶点集的子集,边集合为G的边集的子集,则称 G’为G的子图。 路径:从结点出发v0的交替序列v0e1v1e2···envn称为联结v0到vn的路。 回路: v0和vn分别称作路的起点和终点,边的数目n称作路的长度。当v0=vn时,这条路称作回路。 路径长度:路径上边的条数。 连通:在无向图G中,结点u和v之间若存在一条路,则称结点u和结点v是连通的。 连通图:无向图G是平凡图或G中任意两顶点都是连通的,则称G是连通图。有向图G中,略去各有向边的方向后所得无向图G是连通图,则称G为弱连通图;若G中任意两顶点一个可达另一个,则称G为单向连通图;若G中任意两顶点相互可达,则称G为强连通图。 连通分量:无向图中,顶点间的连通关系是一个等价关系,该等价关系将顶点集合划分成的等价类称为连通分支,这些等价类的数目,称为连通分支数。 图的表示 1.邻接矩阵:用一个矩阵存储顶点之间是否直接有边相连这个二元关系,设图G有n个结点 V={v1,v2,···,vn},则n阶方阵A(G)=(aij)称为G的邻接矩阵。 adj表示邻接,nadj表示不邻接。 2.邻接表:使用链表对邻接矩阵进行改进,每个顶点只保存所有直接与它相连的顶点,所有这些顶点通过链表来动态保存。 优点:使用最小限度的空间保存整个图。 缺点:不能随机访问任意两个顶点的关系,一定要通过顺序查找链表才能确定。 算法描述 //n为图G顶点个数 //定义邻接表的结构,一个结构记录一条边 sturct Edge{ int dest; //记录目的地 int value; //边的权值 Edge* link; //记录链表的下一个元素 }; //申请邻接表空间 Edge* edge=new Edge[n]; int i,u,v; //初始化邻接表 for(i=0;in;i++) edge[i]=null; } Edge* l; //接受输入,(u,v )代表一条边 While(cinuv){ //新建一个邻接表结构 l=new Edge; //填写目的地为顶点v l-dest=v; //把新创建的邻接表结构加入到顶点u的链表中 l-link=edge[u]; edge[u]=l; } //遍历所有边 for(i=0;in;i++){ //取顶点i的邻接表的链表入口元素 l=edge[i]; while(l){ //输出从i出发可以直接到达的边 couti“”l-destendl; //取链表的下一个元素 l=l-link; } } 1.拓扑排序 2.最短路 3.最小生成树 4.图的连通问题 采用邻接表作为有向图的存储结构,且在头结点中增加一个有效顶点的入度,入度为零的顶点即为没有前趋的顶点,删除顶点及弧可以使对应的顶点的入度减1。 为避免重复检测入度为零的顶点,可另设一堆栈存储所有入度为零的顶点,每当输出入度为零的顶点,并从堆栈中删除该节点,反之,当有新的入度为零的顶点则插入。 拓扑排序的算法实现 //edge是图的邻接表,n为图G顶点个数 void TopologicalSort(){ //统计每个顶点的入度数 int* degree=new int[n]; memset(degree,0,n*sizeof(int)); int i; Edge* l; for(i=0;in;i++) { l=edge[i]; while(l){ //i的所有直接后继的入度数加1 degree[l-dest]++; l=l-link;} } //top是入度为0的顶点的栈的栈顶指针 int top=-1; //建立入度为0的顶点的栈 for(i=0;in;i++) { if(degree[i]==0){ degree[i]=top; top

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档