国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結構】圖的定義,存儲,遍歷

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結構】圖的定義,存儲,遍歷。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??專欄【數(shù)據(jù)結構】

??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。

??音樂分享【Dream It Possible】

大一同學小吉,歡迎并且感謝大家指出我的問題??

目錄

??前言

??圖的定義?

???????有向完全圖

??????無向完全圖

??存儲結構

??????鄰接矩陣?

??代碼

??????采用鄰接矩陣表示法創(chuàng)建無向? 網(wǎng)

??算法步驟

??算法描述

???????采用鄰接矩陣表示法創(chuàng)建無向? 網(wǎng)

??圖的遍歷

???????深度優(yōu)先遍歷

??算法步驟

??算法描述

??廣度優(yōu)先遍歷

??算法步驟

??算法描述

??附加?

??????實驗題目

??????代碼

??????運行結果?


?文章來源地址http://www.zghlxwxcb.cn/news/detail-457249.html

??前言

????????圖是一種比線性表和樹更為復雜的數(shù)據(jù)結構。在線性表中,數(shù)據(jù)元素之間僅有線性關系,每個數(shù)據(jù)元素只有一個直接前驅和一個直接后繼;在樹結構中,數(shù)據(jù)元素之間有著明顯的層次關系,并且每一層中的數(shù)據(jù)元素可能和下一層中的多個元素(其孩子結點)相關,但只能和上一層中一個元素(其雙親結點)相關;而在圖結構中,結點之間的關系可以是任意的,圖中任意兩個數(shù)據(jù)元素都可能相關。由此,圖的應用極為廣泛,已滲入諸如物理、化學、通信、計算機,以及數(shù)學等領域。在離散數(shù)學中,圖論是專門研究圖的性質的數(shù)學分支,而在數(shù)據(jù)結構中,則應用圖論的知識討論如何在計算機上實現(xiàn)圖的操作,因此本章主要介紹圖的存儲結構,以及若干圖的操作的實現(xiàn)。

??圖的定義?

????????圖(Graph)G由兩個集合V和E組成,記為G=(V,E),其中V是頂點的有窮非空集合,E是V中頂點偶對的有窮集合,這些頂點偶對稱為邊。V(G)和E(G)通常分別表示圖G的頂點集合和邊集合,E(G)可以為空集。若E(G)為空,則圖G只有頂點而沒有邊。
????????對于圖G,若邊集E(G)為有向邊的集合,則稱該圖為有向圖;若邊集E(G)為無向邊的集合,則稱該圖為無向圖。
????????在有向圖中,頂點對<x,y>是有序的,它稱為從頂點x到頂點y的一條有向邊。因此,<x,y>與1是不同的兩條邊。頂點對用尖括號括起來,對<x,y>而言,x是有向邊的始點,y是有向邊的終點。<x,y>也稱作一條弧,則x為弧尾,y為弧頭。
????????在無向圖中,頂點對(x,y)是無序的,它稱為與頂點x和頂點y相關聯(lián)的一條邊。這條邊沒有特定的方向,(x,y)與(y,x)是同一條邊。為了有別于有向圖,無向圖的頂點對用一對圓括號括起來。

【數(shù)據(jù)結構】圖的定義,存儲,遍歷

???????有向完全圖

有n(n-1)條弧? 的圖

??????無向完全圖

有n(n-1)/2條邊? 的圖

??存儲結構

??????鄰接矩陣?

表示頂點之間相鄰關系的矩陣,設G(V,E)是具有n個頂點的圖,那么G的鄰接矩陣有如下性質

(矩陣實在是畫不好,繪圖能力欠佳,也請大家多多包容??)?

【數(shù)據(jù)結構】圖的定義,存儲,遍歷

?使用鄰接矩陣表示圖,除了一個用于存儲鄰接矩陣的二維數(shù)組外,還需要一個一維數(shù)組來存儲頂點信息

??代碼

//圖的 鄰接矩陣 存儲表示

#define MaxInt 32767     //表示極大值,即 ∞ 
#define MVNum 100        //最大頂點數(shù) 
typedef int VerTexType; //設頂點的數(shù)據(jù)類型為字符型 
typedef int ArcType;     //假設邊的權值類型為整型 

typedef struct{
	VerTexType vexs[MVNum];      //頂點表 
	ArcType arcs[MVNum][MVNum];  //鄰接矩陣
	int vexnum,arcnum;           //圖的當前點數(shù)和邊數(shù) 
}AMGraph; 

??????采用鄰接矩陣表示法創(chuàng)建無向? 網(wǎng)

??算法步驟

1.輸入總頂點數(shù)和總邊數(shù)

2.依次輸入點的信息并將其存入頂點表中

3.初始化鄰接矩陣,每個權值初始化為最大值

4.構造鄰接矩陣,依次輸入每條邊依附的頂點以及其權值,確定兩個頂點在圖中的位置之后,使相應邊賦予相應的權值,同時使其對稱邊賦予相同的權值

??算法描述

int located(AMGraph &G, VerTexType v)
{
    for (int i = 0; i < G.vexnum; i++) {
        if (G.vexs[i] == v) {
            return i;
        }
    }
    return -1; // 未找到,返回 -1
}


int Create(AMGraph &G)
{
	cin>>G.vexnum>>G.arcnum;
	for(i=0;i<G.vexnum;i++)
	{
		cin>>G.vexs[i];
	}
	for(i=0;i<G.vexnum;i++)
	{
		for(j=0;j<G.vexnum;j++)
		{
			G.arcs[i][j]=MaxInt;
		}
	}
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2>>w;
		i=located(G,v1);
		j=located(G,v2);
		G.arcs[i][j]=w;
		G.arcs[j][i]=G.arcs[i][j];
	}
	return 1;
}

???????采用鄰接矩陣表示法創(chuàng)建無向? 網(wǎng)

進行兩處改動即可

1.初始化鄰接矩陣時,把邊的權值初始化為0

2.構造鄰接矩陣時,把權值w修改為1即可

??圖的遍歷

圖的遍歷也是從圖的某一頂點出發(fā),按照某種方法對圖的所有頂點進行訪問且訪問一次

實質:找每個節(jié)點的鄰接點

???????深度優(yōu)先遍歷

深度優(yōu)先搜索(DepthFirst Search, DFS)遍歷類似于樹的先序遍歷,是樹的先序遍歷的推廣。

??算法步驟

(1)從圖中某個頂點v出發(fā), 訪問v。
(2)找出剛訪問過的頂點的第一個未被訪問的鄰接點, 訪問該頂點。 以該頂點為新頂點,重
復此步驟, 直至剛訪問過的頂點沒有未被訪問的鄰接點為止。
(3)返回前一個訪問過的且仍有未被訪問的鄰接點的頂點,找出該頂點的下一個未被訪問的
鄰接點, 訪問該頂點。
(4)重復步驟 (2) 和(3), 直至圖中所有頂點都被訪問過,搜索結束
?
【數(shù)據(jù)結構】圖的定義,存儲,遍歷

?

??算法描述

void DFS(AMGraph G, int v)
{
    printf("%d ", G.vexs[v]);     // 訪問頂點 v
    visited[v] = true;            // 標記為已訪問
    for (int w = 0; w < G.vexnum; w++)
    {
        if (G.arcs[v][w] != MaxInt && !visited[w])
        {
            DFS(G, w);   // 對未訪問的鄰接頂點遞歸調用DFS
        }
    }
}

??廣度優(yōu)先遍歷

??算法步驟

(1) 從圖中某個頂點v出發(fā),訪問v。
(2)依次訪問v的各個未曾訪問過的鄰接點。
(3)分別從這些鄰接點出發(fā)依次訪問它們的鄰接點, 并使 “先被訪問的頂點的鄰接點“ 先于”后被訪問的頂點的鄰接點” 被訪問。重復步驟(3), 直至圖中所有已被訪問的頂點的鄰接點都被
訪間到
【數(shù)據(jù)結構】圖的定義,存儲,遍歷

?

??算法描述

void BFS(AMGraph G, int v)
{
    int front = 0, rear = 0;
    int queue[MVNum];     // 定義隊列
    printf("%d ", G.vexs[v]);
    visited[v] = true;
    queue[rear++] = v;    // 將頂點 v 入隊
    while (front != rear)
    {
        int k = queue[front++];   // 出隊一個頂點 k
        for (int w = 0; w < G.vexnum; w++)
        {
            if (G.arcs[k][w] != MaxInt && !visited[w])
            {
                printf("%d ", G.vexs[w]);     // 訪問頂點 w
                visited[w] = true;
                queue[rear++] = w;           // 將頂點 w 入隊
            }
        }
    }
}

??附加?

??????實驗題目

【數(shù)據(jù)結構】圖的定義,存儲,遍歷

?

1.使用鄰接矩陣的方式存儲上邊無向圖;

2.以矩陣的形式輸出無向圖

3.在鄰接矩陣的基礎上實現(xiàn)深度優(yōu)先遍歷和廣度優(yōu)先遍歷。

??????代碼

/*
6 6
1 2 3 4 5 6
1 2 1
2 5 1
5 3 1
3 1 1
1 4 1
4 6 1
*/

#include<iostream>
using namespace std;

#define MaxInt 32767     //表示極大值,即 ∞ 
#define MVNum 100        //最大頂點數(shù) 
typedef int VerTexType; //設頂點的數(shù)據(jù)類型為字符型 
typedef int ArcType;     //假設邊的權值類型為整型 

typedef struct{
	VerTexType vexs[MVNum];      //頂點表 
	ArcType arcs[MVNum][MVNum];  //鄰接矩陣
	int vexnum,arcnum;           //圖的當前點數(shù)和邊數(shù) 
}AMGraph; //Adjacency Matrix Graph 

int v1,v2,i,j,k,w;

int located(AMGraph &G, VerTexType v)
{
    for (int i = 0; i < G.vexnum; i++) {
        if (G.vexs[i] == v) {
            return i;
        }
    }
    return -1; // 未找到,返回 -1
}


int Create(AMGraph &G)
{
	cin>>G.vexnum>>G.arcnum;
	for(i=0;i<G.vexnum;i++)
	{
		cin>>G.vexs[i];
	}
	for(i=0;i<G.vexnum;i++)
	{
		for(j=0;j<G.vexnum;j++)
		{
			G.arcs[i][j]=MaxInt;
		}
	} 
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2>>w;
		i=located(G,v1);
		j=located(G,v2);
		G.arcs[i][j]=w;
		G.arcs[j][i]=G.arcs[i][j];
	}
	return 1;
}

bool visited[MVNum];

// 深度優(yōu)先遍歷
void DFS(AMGraph G, int v)
{
    printf("%d ", G.vexs[v]);     // 訪問頂點 v
    visited[v] = true;            // 標記為已訪問
    for (int w = 0; w < G.vexnum; w++)
    {
        if (G.arcs[v][w] != MaxInt && !visited[w])
        {
            DFS(G, w);   // 對未訪問的鄰接頂點遞歸調用DFS
        }
    }
}

// 廣度優(yōu)先遍歷
void BFS(AMGraph G, int v)
{
    int front = 0, rear = 0;
    int queue[MVNum];     // 定義隊列
    printf("%d ", G.vexs[v]);
    visited[v] = true;
    queue[rear++] = v;    // 將頂點 v 入隊
    while (front != rear)
    {
        int k = queue[front++];   // 出隊一個頂點 k
        for (int w = 0; w < G.vexnum; w++)
        {
            if (G.arcs[k][w] != MaxInt && !visited[w])
            {
                printf("%d ", G.vexs[w]);     // 訪問頂點 w
                visited[w] = true;
                queue[rear++] = w;           // 將頂點 w 入隊
            }
        }
    }
}

int main()
{
    AMGraph G;
    Create(G);
    printf("存儲成功\n");

    // 輸出鄰接矩陣
    for (int i = 0; i < G.vexnum; i++)
    {
        for (int j = 0; j < G.vexnum; j++)
        {
            if (G.arcs[i][j] == MaxInt)
            {
                printf("∞ ");
            }
            else
            {
                printf("%d ", G.arcs[i][j]);
            }
        }
        printf("\n");
    }

    // 初始化訪問標記數(shù)組
    for (int i = 0; i < G.vexnum; i++)
    {
        visited[i] = false;
    }

    printf("深度優(yōu)先遍歷: ");
    for (int i = 0; i < G.vexnum; i++)
    {
        if (!visited[i])
        {
            DFS(G, i);
        }
    }
    printf("\n");

    // 重置訪問標記數(shù)組
    for (int i = 0; i < G.vexnum; i++)
    {
        visited[i] = false;
    }

    printf("廣度優(yōu)先遍歷: ");
    for (int i = 0; i < G.vexnum; i++)
    {
        if (!visited[i])
        {
            BFS(G, i);
        }
    }
    printf("\n");

    return 0;
}

??????運行結果?

【數(shù)據(jù)結構】圖的定義,存儲,遍歷

??如果大家有不明白的地方,或者文章有問題,歡迎大家在評論區(qū)討論,指正?????

?

到了這里,關于【數(shù)據(jù)結構】圖的定義,存儲,遍歷的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 圖的數(shù)據(jù)結構,系統(tǒng)學習圖的基本概念、定義和建立,學會鄰接矩陣、鄰接表以及實現(xiàn)六度空間案例,遍歷圖的方式——廣度、深度訪問

    圖的數(shù)據(jù)結構,系統(tǒng)學習圖的基本概念、定義和建立,學會鄰接矩陣、鄰接表以及實現(xiàn)六度空間案例,遍歷圖的方式——廣度、深度訪問

    圖 :G = (V,E) Graph = (Vertex, Edge) V:頂點(數(shù)據(jù)元素)的有窮非空集合; E:邊的有窮集合。 有向圖 :每條邊都是有方向的 ? ? 無向圖 :每條邊都是無方向的 ? 完全圖 :任意兩點之間都有一條邊相連 ? ?無向完全圖:n個頂點,n(n-1)/2條邊 無向完全圖:n個頂點,n(n-1)條邊 稀疏

    2023年04月22日
    瀏覽(19)
  • 【數(shù)據(jù)結構】16 二叉樹的定義,性質,存儲結構(以及先序、后序、中序遍歷)

    【數(shù)據(jù)結構】16 二叉樹的定義,性質,存儲結構(以及先序、后序、中序遍歷)

    一個二叉樹是一個有窮的結點集合。 它是由根節(jié)點和稱為其左子樹和右子樹的兩個不相交的二叉樹組成的。 二叉樹可具有以下5種形態(tài)。 一個二叉樹第i層的最大結點數(shù)為 2 i ? 1 2^{i-1} 2 i ? 1 , i ≥ 1 i geq 1 i ≥ 1 每層最大結點可以對應完美二叉樹(滿二叉樹),其所有分支結

    2024年02月20日
    瀏覽(17)
  • 數(shù)據(jù)結構 | 圖的遍歷

    數(shù)據(jù)結構 | 圖的遍歷

    使用鄰接矩陣法存儲圖的信息,其中 一維矩陣 Vexs[] 存儲節(jié)點信息 二維矩陣?Edges[][] 存儲邊的信息 一維矩陣 visited[] 記錄當前節(jié)點是否被訪問過,用于后面的遍歷 本文所使用的圖的結構如下: 對應的 Vexs[] 為:A,B,C,D,E,F(對應的數(shù)組下標從0到5) 對應的?Edges[][] 如下: 圖的

    2024年02月04日
    瀏覽(27)
  • 數(shù)據(jù)結構--5.3圖的遍歷(廣度優(yōu)先遍歷)

    廣度優(yōu)先遍歷: ? ? ? ? 廣度優(yōu)先遍歷(BreadthFirstSearch),又稱為廣度優(yōu)先搜索,簡稱BFS。 要實現(xiàn)對圖的廣度遍歷,我們可以利用隊列來實現(xiàn)。 ?(參考隊列)(上述為結構)

    2024年02月10日
    瀏覽(21)
  • 【數(shù)據(jù)結構】圖的創(chuàng)建與遍歷

    【數(shù)據(jù)結構】圖的創(chuàng)建與遍歷

    圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。 線性表 :線性關系,由直接前驅和直接后繼組成。 樹 :層次關系,由父結點和孩子結點組成,每個結點最多有一個父結點(根

    2023年04月22日
    瀏覽(21)
  • 【數(shù)據(jù)結構】圖的廣度優(yōu)先遍歷

    【數(shù)據(jù)結構】圖的廣度優(yōu)先遍歷

    廣度優(yōu)先遍歷,類似于樹的層次遍歷,又是熟悉的隊列實現(xiàn)。首先將第一個頂點添加到隊列中,然后講該頂點的所有鄰接頂點都加入隊列中,再將該頂點輸出。如此重復直到遍歷完整個圖。 Q:隊列,用于存放頂點。 front,rear:隊頭和隊尾指針,用于入隊和出隊。 p:工作指針,用

    2024年02月05日
    瀏覽(19)
  • 數(shù)據(jù)結構 第六章 圖——圖的遍歷

    數(shù)據(jù)結構 第六章 圖——圖的遍歷

    在前面我們知道,樹是一種非線性結構,為了方便它在計算機中的存儲,對樹進行遍歷使它線性化。 而圖同樣也是一種非線性結構,但是圖又是一種不同于樹的多對多結構,所以在前面我們將其轉換為了多個一對多的結構來描述它的存儲結構。 圖的遍歷同樹類似,也是從某

    2024年02月08日
    瀏覽(23)
  • 大話數(shù)據(jù)結構-圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷

    大話數(shù)據(jù)結構-圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷

    ??圖的遍歷分為深度優(yōu)先遍歷和廣度優(yōu)先遍歷兩種。 ??深度優(yōu)先遍歷(Depth First Search),也稱為深度優(yōu)先搜索,簡稱DFS,深度優(yōu)先遍歷,是指從某一個頂點開始,按照一定的規(guī)則,訪問并記錄下一個未訪問頂點。對于非連通圖,則是按連通分量,采用同一規(guī)則進行深度優(yōu)

    2024年02月04日
    瀏覽(24)
  • (超詳細)C++圖的深度優(yōu)先遍歷、廣度優(yōu)先遍歷(數(shù)據(jù)結構)

    (超詳細)C++圖的深度優(yōu)先遍歷、廣度優(yōu)先遍歷(數(shù)據(jù)結構)

    ? ? ? ? 根據(jù)下圖,編寫代碼實現(xiàn)圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷。 ?? ??????按照英文字母順序,以鄰接表為存儲結構,實現(xiàn)圖的深度優(yōu)先和廣度優(yōu)先遍歷。遍歷的順序從頂點a開始。 以用戶指定的結點為起點,分別輸出每種遍歷下的結點訪問序列。 ? (1)從頂點a,

    2024年02月08日
    瀏覽(28)
  • 【數(shù)據(jù)結構】鄰接矩陣和鄰接圖的遍歷

    【數(shù)據(jù)結構】鄰接矩陣和鄰接圖的遍歷

    本篇文章開始學習數(shù)據(jù)結構的圖的相關知識,涉及的基本概念還是很多的。 本文的行文思路: 學習圖的基本概念 學習圖的存儲結構——本文主要介紹鄰接矩陣和鄰接表 對每種結構進行深度優(yōu)先遍歷和廣度優(yōu)先遍歷 話不多說,狠活獻上 等等,先別急,正式學習之前先認識幾個

    2024年02月04日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包