这章学习了图,学习了图的两种存储结构:邻接矩阵和邻接表。这两种存储结构都用到了以前学c时学到的结构体,将结构体充分运用。知道了图的两种遍历方法:深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历是一个对每一个结点查找其邻接点的过程,而广度优先遍历则搜索了全部节点。 经过学习Prim算法和Kruskal算法,解决了最小生成树问题。在学习Prim算法的同时,还提到了贪心算法,以前学习的贪心算法只能解决局部最优的问题,因此最小生成树的问题不能够用贪心算法来作。 学习最短路径时,先学的Dijstra算法,可是Dijstra算法存在只能解决最短路径,而不能解决最长路径的问题,由此引进了Floyd算法,在知足最小路径查找的同时也能知足最长路径的查找。 拓扑排序和关键路径都是对有向无环图的操做。拓扑排序能够用来判断一个有向图是否有环,还能够解决教学系统中的排课问题;关键路径则是用来解决最短工时的问题。
图着色问题是一个著名的NP彻底问题。给定无向图G=(V,E),问能否用K种颜色为V中的每个顶点分配一种颜色,使得不会有两个相邻顶点具备同一种颜色? 但本题并非要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是不是图着色问题的一个解。
//设计思路 先建一个无向图的邻接矩阵。在每次判断解是否正确的过程当中:先判断使用的颜色是否为k种,是,则继续操做,反之,输出“No”进入下一轮循环;用双重for循环判断每一个结点的临边颜色是否符合要求。
//伪代码(主函数) 定义三个整型变量v、e、k、n,分别用于存放结点数、边数、颜色数,和 解的数量; 输入v、e、k; 定义一个MGraph型变量G; 利用CreatMGrap函数建立无向图; 输入解的数量n; while n-- do 定义int型变量:flag=1,用于控制解不正确时的状况;num数组,用于存储各个结点的颜色;count=0,用于计算各个接中使用的颜色数量;hash数组,用于控制颜色数量的计算; for i=0 to G.n do 输入num[i]; if hash[num[i]]等于0 then //num[i]颜色没出现过期 hash[num[i]]++; count++; end if end for if count的值与k不相等时 then 输出“No” continue进入下一轮循环 end if for i=0 to G.n do for j=i to G.n do //无向图的邻接矩阵关于对角线对称,因此只要判断半个邻接矩阵 if i与j不相等 then if i与j结点的颜色相同 且 i与j结点间有边 then 输出“No” flag=0 break end if end if end for if flag=0 then break end if end for if flag=1 then 输出“Yes” end if end while
N个村庄,从1到N编号,如今请您兴建一些路使得任何两个村庄彼此连通。咱们称村庄A和B是连通的,当且仅当在A和B之间存在一条路,或者存在一个存在C,使得A和C之间有一条路,而且C和B是连通的。 已知在一些村庄之间已经有了一些路,您的工做是再兴建一些路,使得全部的村庄都是连通的,而且兴建的路的长度是最小的。
//伪代码(Prim函数) 定义一个int型数组lowcost[],变量MIN用于存放最小值,v,赋初值为1,cost用于计算花费,赋初值为0; 定义一个int型数组closest[],用于存放最近的结点,变量i,j,k,用于循环中 定义一个ArcNode型变量p 将0赋值给lowcost[v] for i=2 to 图的节点数 do lowcost[i]=10000001 //赋初值,令数组的初值最大 end for 将G->adjlist[v].firstarc的值赋给p while p不为空 do 将p->weight的值赋给lowcost[p->adjvex] 将v的值赋给closest[p->adjvex] 令p等于p指向的下一个结点 end while for i =1 to 图的节点数 do 赋初值1000000给MIN for j=1 to 图的结点数 do if lowcost[j]不等于-1 且 小于MIN then 将 lowcost[j]的值赋给MIN 将j的值赋给k end if end for 将MIN的值累加给cost lowcost[k]=-1 将G->adjlist[k].firstarc的值赋给p while p不为空 do if p->weight小于lowcost[p->adjvex] 且 lowcost[p->adjvex]不等于-1 then 将p->weight的值赋给lowcost[p->adjvex] 将k的值赋给closest[p->adjvex] end if 令p等于p指向的下一个结点 end while end while 输出cost
A1:改过来以后就对了。算法
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。如今须要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。若是有若干条路径都是最短的,那么须要输出最便宜的一条路径。
//伪代码(Dijkstra函数) 定义int型变量v,i,MIN1,MIN2 定义ArcNode型变量p 定义int型数组dist1[1000]、path[1000]、dist2[1000] 定义一个int型静态局部变量数组visted[1000] for i=0 to 图的节点数 do dist1[i]=100000 dist2[i]=100000 path[i]=-1 end for 将Begin的值赋给v 将0分别赋给dist1[v]和dist2[v],将v赋给path[v] while 1 do 将100000分别赋给MIN1和MIN2 for i=0 to 图的结点数 do if dist1[i]的值小于MIN1 且 visted不等于1 then if dist1[i]的值小于MIN1 或者 dist2[i]的值小于MIN2 then 将dist1[i]的值赋给MIN1 将dist2[i]的值赋给MIN2 将i的值赋给v end if end if end for if v等于END then 退出循环 end if visted[v]=1 将G->adjlist[v].firstarc的值赋给p while p不为空时 do if p->length与diat1[v]的和 小于等于 dist1[p->adjvex] then if p->length与diat1[v]的和 小于 dist1[p->adjvex] 或者 p->price与diat2[v]的和 小于 dist2[p->adjvex] then 将p->length与diat1[v]的和赋给dist1[p->adjvex] 将p->price与diat2[v]的和 赋给dist2[p->adjvex] 将v的值赋给path[p->adjvex] end if end if p等于p指向的下一个结点 end while end while 输出dist1[v]和dist2[v]的值
这题主要是关于迪杰斯特拉算法的一个应用。代码基本都是照着书上的代码修修改改完成的。而后调试什么的都在VS上完成了。数组
当时上机考试的时候,由于时间问题和对这章知识的不熟悉,只作了两道题(两道题都作出来了)。当时还剩几分钟的时候看了一下六度空间的题目,当时代码打了一半半时间就到了,就没打完,就把回来后打的代码贴上来。函数
//解题思路 利用广度优先遍历的算法来找到距离小于6的结点个数,来算出百分比
//伪代码(bfs函数) 定义int型变量i,数组vis[10001],并赋初值为0 定义int型变量last,令其等于num(用来记录每层的最后一个元素);tail,用于记录每层压入时的结点,level,并赋初值为0;count赋初值为1 定义一个int型队列q 将num入队 将1赋给vis[num] while q不为空时 do 将队头的值赋给num 出队 for i=1 to v do if g[num][i]等于1 且 vis[i]等于0 then count++ 将1赋给vis[i] 将i入队 将i 赋给tail end if end for if last等于num then //弹出的x等于当前层的最后一个元素 level++ 将tail的值赋给last end if if level的值为6时 then 退出循环 end if end while 将count的值返回主函数