DS博客作业06--图

1.本周学习总结

1.1 思维导图

1.2 学习体会 💪

本章学习了图结构的相关知识,图形结构属于复杂的非线性数据结构,在实际应用中很多问题可以用图来描述。对于图结构的认识,图中元素之间的关系是多对多的;图结构的存储分为临邻接矩阵和邻接表;图的遍历分为深度遍历和广度遍历,深度遍历求出的路径不一定时最短路径,而广度遍历求出的路径一定是最短路径。

关于图的学习,可能是因为临近期末,这几周的学习比较赶,学到的知识也掌握的不是很熟练,比如最小生成树的Prim算法、Kruscal算法,最短路径Dijkstra算法、Floyd算法这几种算法掌握的不是很好,总是忘得很快,容易混淆。

2.PTA实验作业

2.1 图着色问题

2.1.1 设计思路

int main() //主函数
输入顶点数与边数,颜色数进行建图
     输入待检查的颜色分配方案的个数n
    for( ;n;n--){
            for i=1 to 顶点数{
             输入颜色的分配方案,统计所用颜色总数num
              }
         若统计的颜色总数num!=题干的颜色数     
              则把flag由0赋为1
      }
         将颜色按深度遍历排序储存在数组中
          for i=1 to 顶点数{
                for j=1 to 顶点数{
                  若有相邻的颜色相同
                      则把flag的值由0赋为1
               }
             flag值已为1即已有相邻颜色相同停止循环
      }
   如果flag=1 输出no 否则 输出yes

2.1.2 代码截图



2.1.3 PTA提交列表说明。

  • 计算颜色种类时,变量忘记初始化为0
  • 数组上限定义不够

2.2 六度空间

2.2.1 设计思路

int main() 
	输入N,M;
	构建邻接矩阵; 
	for i = 1 to N
		调用BFS(i);
		初始化visit数组;
		计算百分比,并输出;
int BFS(int v) 
	定义队列q;
	定义 temp, count = 1;
	定义level= 0; //记录层数
	定义last = V;//记录当前层数的最后一个元素 
	定义tail;//指向下一层最后一个元素
	把v入队;
	visit[v] = 1;
	while (!q.empty()) 
		取队头元素;
		出队;
		for i = 1 to N
			if arr[temp][i] && visit[i] == 0 then 
				count++;
				tail = i;
				visit[i] = 1;
				i进队;
			end if 
		if temp == last then 
			level++;
			修改last的值为tail;
		end if
		if level == 6 then
			break;
	返回 count;

2.2.2 代码截图


2.2.3 PTA提交列表说明。

  • 自己做的时候,总有问题,一直过不了,后来参考同学的代码
  • 这个代码比较简洁,运用了队列,也使用了memset函数,使初始化更加简洁

2.3 公路村村通

2.3.1 设计思路

int main()
    定义 最低成本cost = 0;
    输入v,e;
    建图;
    cost =Prim(v,e);
    输出cost;
void CreateGraph(int v,int e)//用邻接矩阵表示图
    初始化;
    读入权值;
    无向图对称;
int Prim(int v,int e)
    定义min,i,j,k;
    定义 lowcost[MAXVEX];
    定义 cost =0;
    lowcost[1] = 0; //初始化第一个权值为0,即v0加入生成树
    for i=2 to v
        lowcost[i] = G[1][i];//对顶点1所相邻的边进行初始化
    for i=2 to v
        令min等于无穷;
        j = 1;
        k = 0;
        while( j<=v )
            将lowcost[]数组最小的边赋值给min;
            用k记录该边所对应的顶点;
            j++;
        if k==0 then //不连通
            return -1;
		end if;
        cost += min;
        lowcost[k] = 0; //将当前顶点设置为0,表示此结点已经完成任务
        for j=2 to v
            if lowcost[j]!=0 && G[k][j]<lowcost[j] then
            //若下标为k顶点各边权值小于此前这些顶点未被加入生成树的权值
                lowcost[j] = G[k][j];
            end if;
    返回 cost;

2.3.2 代码截图



2.3.3 PTA提交列表说明。

  • 刚开始对图初始化时,令 G[i][j]=NULL ,而且 没有令min等于无穷,后来请教同学将min设为不存在边的g数组的值,以此来判断各个顶点与其他顶点是否存在边

3.上机考试错题及处理办法

3.1 截图错题代码


3.2 错的原因及处理方法

  • 刚开始也不知道哪里错了,编译出来的答案是错的,后来看了半天发现,其中一个for循环里面i没有赋初值,导致计数并不是从1开始,导致答案错误

  • 错误:

posted @ 2019-06-02 15:44  _TY  阅读(237)  评论(0编辑  收藏  举报