• DS博客作业06--图


    1.本周学习总结(

    1.思维导图

    2.谈谈你对图结构的认识及学习体会。

    深度遍历算法:
    1.从图的某个初始顶点v出发,首先访问初始顶点v,然后选择一个与定点v相邻且没有被访问过的顶点w为下一个初始顶点,再从w出发进行深度优先遍历,知道图中与当前顶点v邻接的所有顶点都被访问过为止。
    2.采用递归的方法一般采用邻接表存储结构
    3.时间复杂度为O(n+e)用邻接矩阵时时间复杂度为O(n*n)
    广度遍历算法:
    1.先访问初始顶点v,接着访问顶点v的所有未被访问过的邻接点,依次类推,直到图中所有和初始顶点v有路径相通的顶点都被访问过为止。
    2.采用循环嵌套方式以邻接表为存储结构,通过一个队列的出入队来标记是否访问过。
    拓扑排序算法
    1. 与深度遍历结合可以检测是否产生环路
    2. 在一个有向图中找到一个拓扑序列的过程(有向无环图)
    

    2.PTA实验作业

    2.1.题目1:图着色问题

    2.1.1设计思路(伪代码)

    int main(){
    定义变量
    输入所需要处理的颜色分配scanf("%d%d%d",&v,&e,&k);
    for(int i = 0;i<e;i++){
    输入
    对应入栈}
    scanf("%d",&num);
    while(num--){
    bool flag = true;
    清零初始化
    for(int i = 1;i <= v;i++){
    scanf("%d",&color[i]);
    读入着色}
    if(不符合图着色对应要求)
    flag = false;
    for(int i = 1;i <= v;i++){
    for(int j = 0;j < mp[i].size();j++){
    双重循环判断邻接矩阵存储模式下的图颜色}}
    if(!flag)
    break;}
    根据flag值 输出是否符合条件}
    return 0;}
    

    2.1.2代码截图


    2.1.3本题PTA提交列表说明

    2.2.题目2:拓扑排序

    2.2.1设计思路(伪代码)

    int 定义num数组 ,count表示邻结点数  st为栈数组     
       int 定义栈顶指针top为-1
          for(i从1到n)
              将领接表的结点的邻结点都置为0
          for(i从1到n)
              p指向第一条边
              while(p不空)
                  计算各结点的邻结点数
           for(i从1到n)
               if(某一结点的邻结点为0)
      	将此时的i入栈
           while(栈非空)
               i=栈顶元素
               top--
               将i的值赋给num【count】 ,并且count++
               p指向邻接表的第一条边
               while(p不空)
               j=p指向终点的编号
               j的邻边数-1
               if(当j的邻边数等于0时)
    	入栈j
               p=p->nextarc 	p指向下一条边
             if(count==G->n) 	即最后结点为0的数等于原来的总结点数
               	 证明拓扑排序完成
                     for(i从0到count-1)
    	        输出num数组
             else	
    	代表拓扑排序还未完成
    

    2.2.2代码截图

    2.2.3本题PTA提交列表说明。

    2.3.题目3:六度空间

    2.3.1设计思路(伪代码)

     int i, vis[10001] = { 0 };
      int last = z              记录每层的最后一个元素:该层压入之后弹出之前更新:last=temp;
      int tail 	                 用于记录每层压入时的结点
      queue<int>q          用到队列的类
        q.push(z)      z入队
        vis[z]                     表示z遍历过
       while(队列q不空)
               z=q.front       重复把队头赋给z
               q.pop()      队头元素出队
                for(i从一到v)
    	 if(g【z】【i】==1并且 vis【i】==0)   两结点有链连接并且i未遍历过
    	       count++
    	       vis【i】==1	将vis【i】置为1,即遍历过
    	       q.push(i)	将i推入队列   
                if (last == z)		一层全部弹出,准备开始弹下一层:弹出的(x)=当前层最后一个元素(last) 	{
    	  level++;	
                      last = tail;	一层全都压入完后,更新last
                if (level == 6) break; 	    如果level达到6了退出循环 
         return count         
     main函数里面就是输出格式以及将结点之间通过邻接矩阵连接起来
    

    2.3.2代码截图

    2.3.3本题PTA提交列表说明。

    3、上机考试错题及处理办法(-2--2分)

    3.1.截图错题代码

    3.2 错的原因及处理方法

    错的原因

    在while (top>-1)循环里面 count应该递增,并且将p指向第一条边
    并且下一个if 不应该包括p=p->nextarc   因为不论是否满足if都应该指向下一个结点
    

    解决方法

    在while循环里加上count++  ;p=G->adjlist[i].firstarc
    将下一个if中的p=p->nextarc 移到括号外
    
  • 相关阅读:
    Java7 和 Java8 中的 ConcurrentHashMap 原理解析
    Java 7 和 Java 8 中的 HashMap原理解析
    “三次握手,四次挥手”你真的懂吗?
    互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第四篇
    互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第三篇
    互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第二篇
    互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第一篇
    面试中被问Spring循环依赖的三种方式!!!
    Elasticsearch 技术分析(六): 自动发现机制
    Elasticsearch 技术分析(四): 分布式工作原理
  • 原文地址:https://www.cnblogs.com/yvvq/p/10963263.html
Copyright © 2020-2023  润新知