• DS博客作业04--图


    0.PTA得分截图

    1.本周学习总结(0-5分)

    1.1 总结图内容

    • 图存储结构
    //邻接矩阵
    #define  MAXV //决定数组大小
    typedef struct
    {
       int edges[MAXV][MAXV];     //邻接矩阵
       int n,e;  		      //顶点数,弧数
    } MGraph;
    
    //邻接表
    typedef struct ANode
    {
       int adjvex;			//该边的终点编号
       struct ANode *nextarc;	//指向下一条边的指针
       int info;	                //该边的相关信息,如权重
    } ArcNode;		        //边表
    
    typedef struct Vnode
    {
       int data;			//顶点信息
       ArcNode *firstarc;		//指向第一条边
    } VNode;			//邻接表头节点类型
    
    typedef struct
    {
       VNode adjvex[MAXSIZE];	//邻接表
       int n,e;		        //图中顶点数n和边数e
    } AdjGraph;
    
    • 建图
    //建邻接矩阵
    void CreateMGraph(MGraph& g, int n, int e)//建无向图 
    {
    	int i, x, y;
    	int vex1, vex2;
    	g.n = n, g.e = e;
    	for (x = 0; x < n; x++)
    	{
    		for (y = 0; y < n; y++)
    		{
    			g.edges[x][y] = 0;
    		}
    	}
    	for (i = 0; i < e; i++)
    	{
    		cin >> vex1 >> vex2;
    		g.edges[vex1 - 1][vex2 - 1] = 1;
                    //有向图写到这为止
    		g.edges[vex2 - 1][vex1 - 1] = 1;
    	}
    }
    
    //建邻接表
    void CreateAdj(AdjGraph*& G, int n, int e) //创建图邻接表
    {
    	int i;
    	int a, b;
    	ArcNode* p1, * p2;//有向图去掉p2
    	G = new AdjGraph;
    	G->n = n, G->e = e;
    	for (i = 1; i <= n; i++)G->adjlist[i].firstarc = NULL;
    	for (i = 0; i < e; i++)
    	{
    		p1 = new ArcNode;
    		p2 = new ArcNode;//有向图去掉这句
    		cin >> a >> b;
    		p1->adjvex = b;
    		p1->nextarc = G->adjlist[a].firstarc;
    		G->adjlist[a].firstarc = p1;
                    //有向图写到这里
    		p2->adjvex = a;
    		p2->nextarc = G->adjlist[b].firstarc;
    		G->adjlist[b].firstarc = p2;
    	}
    }
    
    • 图遍历及应用
    //深度优先搜索DFS
    void DFS(AdjGraph* G, int v)
    {
    	ArcNode* p;
    	visited[v] = 1;
    	p = G->adjlist[v].firstarc;
    	while (p)
    	{
    		if (visited[p->adjvex] == 0)
    		{
    			DFS(G, p->adjvex);
    		}
    		p = p->nextarc;
    	}
    }
    
    //广度优先搜索BFS
    void BFS1(AdjGraph* G, int v)//连通图
    {
    	queue<ArcNode*>q;
    	ArcNode* p;
    	visited[v] = 1;
    	q.push(G->adjlist[v].firstarc);
    	while (!q.empty())
    	{
    		p = q.front();
    		while (p)
    		{
    			if (visited[p->adjvex] == 0)
    			{
    				visited[p->adjvex] = 1;
    				q.push(G->adjlist[p->adjvex].firstarc);
    			}
    			p = p->nextarc;
    		}
    		q.pop();
    	}
    }
    
    void  BFS2(AdjGraph *G)
    {      int i;
            for (i=0;i<G->n;i++)
                 if (visited[i]==0)//不重复遍历已遍历的顶点 
                      BFS1(G,i);
    }
    
    • 判断图是否连通
      • 使用BFS1或DFS遍历一遍后,visited数组都为1即图为连通
    • 最短路径
    //Dijkstra算法
    
    
    • 最小生成树相关算法及应用
    //Prim算法
    
    //Kruskal算法
    
    • 拓扑排序
    • 关键路径

    1.2.谈谈你对图的认识及学习体会。
    学完非线性结构中最实用的图,或许有了树的基础,学起来不会太蒙,但在写代码的时候真的挺难,很多地方写起来不像学起来一样直白,有时候连自己想的思路写起来的磕磕碰碰的,可能还需要花一段时间才能熟练掌握
    2.阅读代码

    2.1 题目及解题代码

    • 题目

    • 解题代码

    2.1.1 该题的设计思路

    本体利用DFS+道标完成,首先设置一个路标数组,0-3分别代表四种状态,未访问,已访问,非安全,安全,通过DFS遍历每个结点,对每个结点的下个结点遍历失败,本节点失败,若不失败则返回成功

    2.1.2 该题的伪代码

    
    

    2.1.3 运行结果

    网上题解给的答案不一定能跑,请把代码复制自己运行完成,并截图。

    2.1.4分析该题目解题优势及难点

  • 相关阅读:
    【个人博客设计】
    复杂多边形光栅化算法
    xmake 描述语法和作用域详解
    协程分析之context上下文切换
    tbox协程使用之切换与等待
    记boost协程切换bug发现和分析
    跨平台自动构建工具v1.0.2 发布
    xmake从入门到精通9:交叉编译详解
    xmake从入门到精通9:交叉编译详解
    跨平台c开发库tbox:内存库使用详解
  • 原文地址:https://www.cnblogs.com/bestACG/p/12832756.html
Copyright © 2020-2023  润新知