本章学习了图结构的的相关知识,相对于树各有各的难点,树更多的递归,图更相似于一个二维结构,图属于复杂的非线性数据结构,在实际应用中有不少问题能够用图来描述,好比网络,在图形结构中,每一个元素能够有零个或者多个前驱元素,也能够有零个或者多个后继元素,元素之间的关系是多对多的,相对于以前的学习,图的基本术语更加复杂。经常使用的图的存储结构有邻接矩阵和邻接表,邻接矩阵就是用二维数组来表示,而邻接表则是定义三个结构体组成的图结构。邻接矩阵更使用于稠密图,邻接表更适用于稀疏图。
须要记录层数,仅计算6层之内的结点数算法
int BFS(vertex V) { visited[V]=true; count=1; level=0; last=v; while(队列不为空) { x=出队列; for(x的每一个邻接点w) { if没有被访问 { visited[w]=true; w进队列; count++; tail=w; } if(访问到该层最后一个元素) { level++; last=tail; } if(层数level=6)break; } 返回count }
其实就是公路村村通的进一步复杂题,这里给的是二维数组输入因此输入方式要用双重for循环,而后将值做为公路的花费,运用最小生成树这里把访问过的设置为-1,已经建好的路且未被访问花费设置为0便可
将各个公路长度输入g[max][max]; 输入公路(x,y)并将其置为0; 定义cost数组; for(遍历全部城市) { 更改全部城市到起始城市1的花费; } 起始城市1的花费cost[1]=-1; 定义sum记录总花费置为0; for(遍历n-1次,把剩下的城市都加入) { 每次循环min重置32768,K=-1; for(遍历全部城市) { 用if语句在没有访问过的城市找出最小花费; 同时k记录最小花费的城市; } if(存在最小花费的城市) { sum+=找到的最小花费; cost[k]=-1以访问过; for(访问全部城市) { 修改cost数组; } } 输出sum;
编译错误由于vs貌似过大的二维数组会溢出,把栈容量修改便可,或者放到全局变量具体为何也不是很清楚。。。数组
定义三个数组edges来记录边,color记录各个顶点的颜色,利用vis判断颜色数量,由于每行顺次给出V个顶点的颜色(第i个数字表示第i个顶点的颜色)因此能够只用判断每次输入的时候标号比他小的全部的直接联通的点两点间的颜色。
for循环初始化图 输入n; for(i=0到i<n) { 初始化flag,num为0; 初始化vis数组为0; for(遍历全部顶点) { 输入color[j]; if(该颜色没有出现过) { vis该颜色置为1; num++; ] if(flag为0同时颜色数量没有超出限制) { for(遍历标号比他小的全部的直接联通的点) { if(出现相同颜色)flag=1; } } if(出现相同颜色或者颜色过多)输出No; else输出Yes; }
错了这两题缘由一个是时间确实不够,只能把特殊状况输出,再者就是熟练度不够其余题目浪费了不少时间,由于devc指针指不出来也是很难受。