图是个多对多的结构,能够用邻接矩阵或者邻接表来储存 图的遍历分为深度优先遍历和广度优先遍历,它们分别适合不一样的问题,例如着色问题适合用深度优先遍历,六度空间适合广度优先遍历 求图的最小生成树能够用普里姆算法或者克鲁斯卡尔算法 求图的最短路径能够用迪杰斯特拉算法或者费洛伊德算法 这些代码书上都有,我以为代码应该要理解的记,不要去死记硬背 图的拓扑排序是对有前后顺序的事件的完成顺序的排序,它是个有向无环图
由于颜色的数目是固定而且可能有重复的的,因此可使用set容器,去掉相同的数 用vector容器的二维数组将每一个顶点链接的顶点储存起来 用book数组存放颜色方案里的每一个顶点所对应的颜色,用for循环遍历对比和该顶点相邻的顶点颜色是否同样
定义全局变量,n,e,colornum分别表明顶点,边数,和颜色数量 定义int型的set容器变量s,二维数组型的vector变量vec,定义数组book,为存放颜色方案的数组 输入n,e,colornum 输入两个端点,放进vec数组中 输入N,表明N个方案 while(N--) do s.clear();//对每一个方案的s里的数据都清除 初始化book数组为0 for i=1 to n do 输入num book[i]=num//book数组存放每一个颜色 将num放入set容器s中 end for if(s.size()!=colornum)//即输入的颜色数量与一开始输入的所给的颜色数量不同 输出No,继续判断下一个颜色方案 for i=1 to n do for j=0 to vec[i].size()-1 若是book[i]与book[vec[i][j]]相等//即相邻的端点颜色同样 输出No,继续判断下一个颜色方案 end for 输出Yes//即没有上面的状况 end while
Q1:这题疯狂试探,老是部分正确,一开始是最小图错误,不是很理解最小图是指什么 A1:而后将数组的下标改了从0开始,就出现了其它的错误 A2:后来又去回顾代码,发现个人judge函数里没有写返回true,只有返回false,这么一个小错误,让我疯狂试探了那么屡次,自闭了
这题至关于求最小生成树 用的是克鲁斯卡尔算法,而且采用了并查集直接进行通量的合并,以及库函数sort根据道路的价格cost进行排序 判断是否能通路,能够根据最小树的特色,边数为端点数-1
定义count=0,输入城镇数量citynum,以及道路数量roads 初始化辅助数组f 输入两个端点x,y和所需的费用cost 用sort对结构体进行排序 for i=0 to roads 若是x,y不是同一个集合 把最小边加到总花费sum里面 count++ end for 若是 count==citynum-1 输出sum 不然输出-1
Q1:这题上机考的题集里也有出现,就是求最小生成树,考试时并无写出来,老师提示用最短路径的代码而后加上prim算法就能够了 A1:可是我连prim算法都不会敲(那会还不会),因而就没写了 A2:后来看书写代码,用的是克鲁斯卡尔算法基本上是看书的,而后并查集不是很懂就上百度了
定义road结构体,里面有distance和cost两个成员 宏定义INF为32767 定义Road的结构体Mat[505][505] 定义citynum,roads,startcity,endcity而且输入 初始化矩阵全部元素为INF while roads--: 给Mat矩阵赋值 弗洛伊德算法 for k=0 to citynum-1: for i=0 to citynum-1: for j=0 to citynum-1: if 原路径比新路径长 更新Mat[i][j]的cost和distance else if 原路径等于新路径: if 原路径消费 > 新路径: 更新Mat[i][j]的cost和distance else 保持不变 输出Mat[startcity][endcity].distance和Mat[startcity][endcity].cost;
A1:这题至关于求最短路径,我用的是费洛伊德算法,三层循环简单粗暴,先判断距离哪一个比较近再判断价格
六度空间
上机考时也没写几道题,除了函数题,就提交了这个编程题,这是那题六度空间的题目 老师上课有讲过这题用广搜就能够作了,可是显然我仍是不是很懂,因此去看了大佬的博客 这题的思路和着色问题有点像,也是用vector容器,存了每一个顶点所链接的点,而后用队列也就是广搜,将没访问到的进行访问并放进set容器里,进行六次的循环,最后对set取长度就能够得出与该结点距离不超过6的结点数了 当时考试前疯狂记代码,而后一会儿记了好几个,到考试时就都记混了,自闭了,最后也没能把这题代码正确打出来,归根结底仍是对代码的理解不透彻,只想着背背代码混个考试,不可以啊 考试结束后看了正确的代码,我离它的差距就是最外层的那个六次的循环,我写成了while(q.size()),就只对了一个测试点,鬼知道我在想这些什么
拓扑排序
拓扑排序思路挺简单的,计算每一个结点的入度,将入度为0的结点放进数组中,而后将度为0的结点标记,并将所连的结点的入度减一 我感受个人代码没得毛病,可是在dev运行,运行不太起来,提交后发现是段错误,这谁顶得住啊,还没找到vs 到最后仍是没看出哪里有毛病,结束后,对比了一下正确的代码,发现就一个下标的错误,将index改为top就对了,我还一直往是否是越界了的方向想,压根没在乎这个地方 果真细节才是魔鬼