图(2)

Jun 07, 2016 pm 03:42 PM
出發 概念 遍歷 頂點

一:图的遍历 1.概念: 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次(图的遍历算法是求解图的 连通性问题 、 拓扑排序 和求 关键路径 等算法的基

一:图的遍历

      1.概念: 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次(图的遍历算法是求解图的连通性问题拓扑排序和求关键路径等算法的基础。)

       2.深度优先搜索(DFS)

            1).基本思想:

                           (1)在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;
                           (2)再从 w1 出发,访问与 w1邻接但还未被访问过的顶点 w2;
                           (3)然后再从 w2 出发,进行类似的访问,… 
                           (4)如此进行下去,直至到达所有的邻接顶点都被访问过为止。
                           (5)接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。
                                     如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;
                                     如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。

            2)算法实现(明显是要用到(栈)递归):                           

Void DFSTraverse( Graph  G, Status (*Visit) (int v))
{         // 对图G做深度优先遍历
    for (v=0; v<g.vexnum visited false for v if dfs void g>//从第v个顶点出发递归地深度优先遍历图G
{
   visited[v]=TRUE ;  Visit(v);  //访问第v个顶点 
   for(w=FirstAdjVex(G,v)/*从图的第v个结点开始*/; w>=0; w=NextAdjVex(G,v,w)/*v结点开始的w结点的下一个结点*/)
       if (!visited[w])   DFS(G,w); 
      //对v的尚未访问的邻接顶点w递归调用DFS 
}
</g.vexnum>
登入後複製

           3)DFS时间复杂度分析:

                     (1)如果用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,因此遍历全部顶点所需的时间为O(n2)。
                     (2)如果用邻接表来表示图,虽然有 2e 个表结点,但只需扫描 e 个结点即可完成遍历,加上访问 n 个头结点的时间,因此遍历图的时间复杂度为O(n+e)。

3.广度优先搜索(BFS)

     1).基本思想:

               (1)从图中某个顶点V0出发,并在访问此顶点后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0                                     有 路径相通的顶点都被访问到;
                (2)若此时图中尚有顶点未被访问(非连通图),则另选图中一个未曾被访问的顶点作起始点;
                (3)重复上述过程,直至图中所有顶点都被访问到为止。

     2).算法实现(明显是要用到队列)              

void BFSTraverse(Graph G, Status (*Visit)(int v)){
            //使用辅助队列Q和访问标志数组visited[v] 
  for (v=0; v<g.vexnum visited false initqueue for v="0;" if true visit enqueue while dequeue u>=0;w=NextAdjVex(G,u,w))
          if ( ! visited[w]){  
           //w为u的尚未访问的邻接顶点
             visited[w] = TRUE; Visit(w);
             EnQueue(Q, w);
          }   //if
       }   //while
   }if
}  // BFSTraverse</g.vexnum>
登入後複製
      3).BFS时间复杂度分析:

               (1) 如果使用邻接表来表示图,则BFS循环的总时间代价为 d0 + d1 + … + dn-1 = 2e=O(e),其中的 di 是顶点 i 的度
               (2)如果使用邻接矩阵,则BFS对于每一个被访问到的顶点,都要循环检测矩阵中的整整一行( n 个元素),总的时间代价为O(n2)。


二.图的连通性问题:

     1. 相关术语:

                 (1)连通分量的顶点集:即从该连通分量的某一顶点出发进行搜索所得到的顶点访问序列;
                 (2)生成树:某连通分量的极小连通子图(深度优先搜索生成树广度优先搜索生成树);
                 (3)生成森林:非连通图的各个连通分量的极小连通子图构成的集合。

     2.最小生成树:

             1).Kruskal算法:

                      先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中去,并使森林中不产生回路,直至森林变成一棵树为止(详细代码见尾文)。

                      图(2)


                 2)Prim算法(还是看上图理解):

                          假设原来所有节点集合为V,生成的最小生成树的结点集合为U,则首先把起始点V1加入到U中,然后看比较V1的所有相邻边,选择一条最小的V3结点加入到集合U中,

                      然后看剩下的v-U结点与U中结点的距离,同样选择最小的.........一直进行下去直到边数=n-1即可。

                    图(2)

                   算法设计思路:

                          增设一辅助数组Closedge[ n ],每个数组分量都有两个域:

                          图(2)

                         要求:求最小的Colsedge[ i ].lowcost   

                        图(2)

           3.两种算法比较:

                      (1)普里姆算法的时间复杂度为 O(n2),与网中的边数无关,适于稠密图;
                      (2)克鲁斯卡尔算法需对 e 条边按权值进行排序,其时间复杂度为 O(eloge),e为网中的边数,适于稀疏图。                  

           4.完整最小生成树两种算法实现:          

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std; 

#define MAX_VERTEX_NUM 20

#define OK 1

#define ERROR 0

#define MAX 1000

typedef struct Arcell
{
	double adj;//顶点类型
}Arcell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct
{
	char vexs[MAX_VERTEX_NUM]; //节点数组,
	AdjMatrix arcs; //邻接矩阵
	int vexnum,arcnum; //图的当前节点数和弧数
}MGraph;

typedef struct Pnode //用于普利姆算法
{

	char adjvex; //节点

	double lowcost; //权值

}Pnode,Closedge[MAX_VERTEX_NUM]; //记录顶点集U到V-U的代价最小的边的辅助数组定义

typedef struct Knode //用于克鲁斯卡尔算法中存储一条边及其对应的2个节点

{

	char ch1; //节点1

	char ch2; //节点2

	double value;//权值

}Knode,Dgevalue[MAX_VERTEX_NUM];

//-----------------------------------------------------------------------------------

int CreateUDG(MGraph & G,Dgevalue & dgevalue);

int LocateVex(MGraph G,char ch);

int Minimum(MGraph G,Closedge closedge);

void MiniSpanTree_PRIM(MGraph G,char u);

void Sortdge(Dgevalue & dgevalue,MGraph G);

//-----------------------------------------------------------------------------------

int CreateUDG(MGraph & G,Dgevalue & dgevalue) //构造无向加权图的邻接矩阵
{
	int i,j,k;
	cout>G.vexnum>>G.arcnum;

	cout>G.vexs[i];

	for(i=0;i<g.vexnum for g.arcs cout cin>> dgevalue[k].ch1 >> dgevalue[k].ch2 >> dgevalue[k].value;

		i = LocateVex(G,dgevalue[k].ch1);

		j = LocateVex(G,dgevalue[k].ch2);

		G.arcs[i][j].adj = dgevalue[k].value;

		G.arcs[j][i].adj = G.arcs[i][j].adj;

	}

	return OK;

}

int LocateVex(MGraph G,char ch) //确定节点ch在图G.vexs中的位置

{

	int a ;

	for(int i=0; i<g.vexnum i if ch a="i;" return void minispantree_prim g u int closedge k="LocateVex(G,u);" for j g.arcs cout g.vexs minimum double minispantree_krsl dgevalue p1 bj sortdge p2="bj[LocateVex(G,dgevalue[i].ch2)];" temp char ch1> dgevalue[j].value)

			{

				temp = dgevalue[i].value;

				dgevalue[i].value = dgevalue[j].value;

				dgevalue[j].value = temp;

				ch1 = dgevalue[i].ch1;

				dgevalue[i].ch1 = dgevalue[j].ch1;

				dgevalue[j].ch1 = ch1;

				ch2 = dgevalue[i].ch2;

				dgevalue[i].ch2 = dgevalue[j].ch2;

				dgevalue[j].ch2 = ch2;

			}

		}

	}

}

void main()

{

	int i,j;

	MGraph G;

	char u;

	Dgevalue dgevalue;

	CreateUDG(G,dgevalue);

	cout>u;

	cout运行结果:

<p>             <img  src="/static/imghw/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140219123300296%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VzdF9fd2FuZ2Zhbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fwust__wangfan%2Farticle%2Fdetails%2F19479007" class="lazy" alt="图(2)" ></p>


</g.vexnum></g.vexnum></iostream></stdlib.h></stdio.h>
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
深入了解Gunicorn的基本原理與功能 深入了解Gunicorn的基本原理與功能 Jan 03, 2024 am 08:41 AM

Gunicorn的基本概念和作用Gunicorn是一個用於在PythonWeb應用程式中運行WSGI伺服器的工具。 WSGI(Web伺服器閘道介面)是Python語言定義的一種規範,用來定義Web伺服器與Web應用程式之間的通訊介面。 Gunicorn透過實作WSGI規範,使得PythonWeb應用程式可以被部署和運行在生產環境中。 Gunicorn的作用是作

元宇宙概念是什麼意思 什麼是元宇宙概念 元宇宙概念是什麼意思 什麼是元宇宙概念 Feb 22, 2024 pm 03:55 PM

元宇宙是利用技术与现实世界映射与交互的虚幻世界。解析1元宇宙【Metaverse】是充分利用技术方式进行链接与创造的,与现实世界映射与交互的虚幻世界,拥有最新型社会发展体制的数据生活空间。2元宇宙本质上是对现实世界的虚拟技术、数字化过程,需要对內容生产、经济系统、客户体验和实体世界內容等进行大量改造。3但元宇宙的发展趋势是循序渐进的,是在共享的基础设施、标准规定及协议的支撑下,由许多工具、平台不断结合、进化而最终成型。补充:元宇宙是什么构成的1元宇宙由Meta和Verse构成,Meta是超越,V

Java如何遍歷資料夾並取得所有檔案名 Java如何遍歷資料夾並取得所有檔案名 Mar 29, 2024 pm 01:24 PM

Java是一種流行的程式語言,具有強大的檔案處理功能。在Java中,遍歷資料夾並取得所有檔案名稱是一種常見的操作,可以幫助我們快速定位和處理特定目錄下的檔案。本文將介紹如何在Java中實作遍歷資料夾並取得所有檔案名稱的方法,並提供具體的程式碼範例。 1.使用遞歸方法遍歷資料夾我們可以使用遞歸方法遍歷資料夾,遞歸方法是一種自身呼叫自身的方式,可以有效地遍歷資料夾中

Oracle RAC 簡介及核心概念 Oracle RAC 簡介及核心概念 Mar 07, 2024 am 11:39 AM

OracleRAC(RealApplicationClusters)簡介及核心概念隨著企業資料量的不斷增長和對高可用性、高效能的需求日益突出,資料庫叢集技術變得越來越重要。 OracleRAC(RealApplicationClusters)就是為了解決這個問題而設計的。 OracleRAC是Oracle公司推出的一種高可用性、高效能的叢集資料庫解

掌握Spring MVC的關鍵概念:了解這些重要特性 掌握Spring MVC的關鍵概念:了解這些重要特性 Dec 29, 2023 am 09:14 AM

了解SpringMVC的關鍵特性:掌握這些重要的概念,需要具體程式碼範例SpringMVC是一種基於Java的Web應用開發框架,它透過模型-視圖-控制器(MVC)的架構模式來幫助開發人員建立靈活可擴展的Web應用程式。了解和掌握SpringMVC的關鍵特性將使我們能夠更有效地開發和管理我們的網路應用程式。本文將介紹一些SpringMVC的重要概念

使用類別的概念編寫Java程式來計算矩形的面積和周長 使用類別的概念編寫Java程式來計算矩形的面積和周長 Sep 03, 2023 am 11:37 AM

Java語言是當今世界上最常用的物件導向程式語言之一。類別的概念是物件導向語言中最重要的特性之一。一個類別就像一個物件的藍圖。例如,當我們想要建造一棟房子時,我們首先創建一份房子的藍圖,換句話說,我們創建一個顯示我們將如何建造房子的計劃。根據這個計劃,我們可以建造許多房子。同樣地,使用類,我們可以創建許多物件。類別是創建許多物件的藍圖,其中物件是真實世界的實體,如汽車、自行車、筆等。一個類別具有所有物件的特徵,而物件具有這些特徵的值。在本文中,我們將使用類別的概念來編寫一個Java程序,以找到矩形的周長和麵

尋找拋物線的頂點、焦點和準線的C/C++程式 尋找拋物線的頂點、焦點和準線的C/C++程式 Sep 05, 2023 pm 05:21 PM

平面上形成一條曲線的點的集合,使得該曲線上的任何點與中心點(稱為焦點)等距都是拋物線。拋物線的一般方程式= ax2+bx+c 拋物線的頂點是其最急轉彎的座標,而

PHP glob()函數使用範例:遍歷指定資料夾中的所有文件 PHP glob()函數使用範例:遍歷指定資料夾中的所有文件 Jun 27, 2023 am 09:16 AM

PHPglob()函數使用範例:遍歷指定資料夾中的所有文件在PHP開發中,經常需要遍歷指定資料夾中的所有文件,以實現檔案批次操作或讀取。 PHP的glob()函數正是用來實現這種需求的。 glob()函數可以透過指定一個通配符匹配模式,來取得指定資料夾中符合條件的所有檔案的路徑資訊。在這篇文章中,我們將會示範如何使用glob()函數來遍歷指定資料夾中的所有文件

See all articles