1. 程式人生 > >【資料結構】mgraph!!

【資料結構】mgraph!!

概念:圖是由定點集合和定點間關係組成的資料結構。
有向圖:在有向圖裡面的\A,C和C,A是不同的兩個邊,即在圖裡面的邊是有方向的。
無向圖:在無向圖裡面的A,C和C,A是相同的一條邊,即在無向圖裡面的邊是沒有方向之分的。
定點的度:定點的度是指與定點相關的邊的個數。

重點

  1. 鄰接矩陣方式儲存圖
  2. 鄰接連結串列方式儲存圖

鄰接矩陣
無向圖:
這裡寫圖片描述
有向圖:
這裡寫圖片描述

程式碼實現:

template<class V, class W, bool flag = false>
class mgraph{
public:
    mgraph(V* arr, size_t size)
        :_flag(flag)
        , _s(arr, arr + size)
    {
        edge.resize(size);
        for
(size_t i = 0; i<size; i++) edge[i].resize(size); } int GetIndex(const V& v1){ int i = 0; for (; i<_s.size(); ++i){ if (_s[i] == v1) return i; } return -1; } void Addedge(const V& v1, const V& v2, const
W& w){ int index1 = GetIndex(v1); int index2 = GetIndex(v2); edge[index1][index2] = w; if (!flag) edge[index2][index1] = w; } void Show(){ int i = 0; int j = 0; int N = _s.size(); printf(" "); for (; i < N; i++){ printf
("%c ", _s[i]); } printf("\n"); for (i = 0; i<N; i++){ printf("%c ", _s[i]); for (j = 0; j < N; j++){ printf("%-2d ", edge[i][j]); } printf("\n"); } } private: bool _flag; vector<V> _s; vector<vector<W>> edge; };

鄰接連結串列的方式儲存圖
無向圖:
這裡寫圖片描述

有向圖:
這裡寫圖片描述

程式碼實現:


template<class W, class V>
struct Node{
    V _value;
    W _key;
    struct Node* next;
    Node(V d, W key)
        :_value(d)
        , _key(key)
        , next(NULL)
    {}
};

template<class V, class W, bool flag = false>
class mgraph{
    typedef Node<W, V> Node;
public:
    mgraph(V* arr, size_t size)
        :_flag(flag)
        ,_s(arr, arr + size)
    {
        _edge.resize(size);
        for (size_t i = 0; i<size; i++){
            Node* tmp = new Node(_s[i],0);
            _edge[i] = tmp;
        }
    }
    Node* GetIndex(const V& v1, const V& v2){
        size_t i = 0;
        for (; i<_edge.size(); i++){
            if (_edge[i]->_value == v1){
                Node* p = _edge[i];
                while (p->next){
                    if (p->_value == v2)
                        return NULL;
                    p = p->next;
                }
                return p;
            }
        }
    }
    void AddEdge(const V& v1, const V& v2, const W& w){
        if (!flag){
            AddEdgecomm(v1, v2, w);
            AddEdgecomm(v2, v1, w);
        }
        else
            AddEdgecomm(v1, v2, w);
    }
    void AddEdgecomm(const V& v1, const V& v2, const W& w){
        Node* p = GetIndex(v1, v2);
        if (p == NULL)
            return;
        Node* tmp = new Node(v2, w);
        p->next = tmp;
    }
    void Show(){
        int i = 0;
        for (; i<_s.size(); i++)
            printf("%c  ", _s[i]);
        printf("\n");
        int j = _edge.size();
        for (i = 0; i<j; i++){
            int k = j;
            Node* p = _edge[i];
            while (k--){
                if (p){
                    printf("%-2c ", p->_value);
                    p = p->next;
                }
                else
                    printf("%-2c ",'X');
            }
            printf("\n");
        }
    }
private:


    bool _flag;
    vector<V> _s;
    vector<Node*> _edge;
};

相關推薦

資料結構mgraph

概念:圖是由定點集合和定點間關係組成的資料結構。 有向圖:在有向圖裡面的\A,C和C,A是不同的兩個邊,即在圖裡面的邊是有方向的。 無向圖:在無向圖裡面的A,C和C,A是相同的一條邊,即在無向圖裡面

資料結構—— 1、不要小瞧陣列

2-1、 使用Java中的陣列 2-2 二次封裝屬於我們自己的陣列 2-3 向陣列中新增元素 2-4 陣列中查詢元素和修改元素 2-5 包含,搜尋和刪除 2-6 使用泛型 2-7 動態陣列 2-8 簡單的複雜度分析 2-9 均攤複雜度和防止複雜度的震盪

資料結構多項式連結串列實現相加

#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 1006; struct node { double coef; int exp; struct n

資料結構合併兩個有序連結串列

#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn = 1e5 + 5; struct node { int num; struct node *next; }; s

雙棧實現整數(支援大於十的整數)計算器資料結構

通過棧的操作實現簡單的計算器 首先定義兩個棧,一個叫s_num用來存放運算元,另一個叫s_opt用來存放操作符。 再定義一個字元陣列用來存放輸入的表示式,初始化為0; 當表示式的字元不為‘/0’時,或者操作符棧中不為空的時候,就要一直執行程式! 在執行的時候做兩個判斷,輸入的不是數字

資料結構二叉樹的相關操作(待更)

#include "stdio.h" #include "stdlib.h" typedef struct node { char data; struct node *rchild,*lchild; }bintnode; typedef bintnode *bintree;//指向該結構體

資料結構陣列實現的線性表(線性表的順序儲存結構)

資料結構 陣列實現線性表 通過陣列實現了一個簡單的線性表 功能: 在陣列尾部新增元素 在陣列指定位置新增元素 根據下標獲取元素 根據下標刪除元素 根據元素刪除元素 獲取當前陣列長度 判斷當前陣列是否為空 列印陣列元素 public

資料結構基本概念

資料基本概念: 資料:描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合.資料元素:是組成資料的,有一定意義的基本單位,在計算機中通常作為整體處理.比如人,牛,羊.資料項:一個數據元素可以由若干個資料項組成,比如人可以有眼,耳,鼻,也可有姓名,年齡,地址

資料結構線段樹2018國慶三校聯考D5T3

題意: 分析: 有一個顯然的暴力方法: 對每個詢問,從左往右做一次,記錄字首和,當某個位置字首和為負後,則刪去當前點。再從右往左做一次。 考慮使這個過程變得高效: 可以將詢問按左端點從右往左排序,然後用棧依次處理每個在從左往右考慮時是否需要刪除。 再利用線段樹,求

資料結構二叉樹的建立和遍歷(非遞迴)

該程式使用的是遞迴地建立方法,以及非遞迴的遍歷演算法 執行環境:Dev-C++ #include <stdio.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild

資料結構二叉樹的建立與遍歷(遞迴)

該程式全是使用遞迴的操作 執行環境是:Dev-C++ #include <stdio.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild,*rchild; }bi

C#資料結構001-線性表:順序表

C#資料結構:順序表結構 1、自定義順序表結構 using System.Collections; using System.Collections.Generic; /// <summary> ///線性表介面 /// </summary> /// <type

資料結構

1.有了遞迴,為什麼還需要非遞迴? 嚴格來說,是因為非遞迴的效率比遞迴的效率高,但是,我們都知道,現在的編譯器很強大,優化的效果也非常好,所以非遞迴的效率並不比遞迴好多少,那麼為什麼還要使用非遞迴呢?最主要的原因是遞迴有一個非常大的缺陷:它只適合在分治的情況下使用,當你的應用場景下面遞迴深度太深

資料結構前序遍歷與中序遍歷構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNo

資料結構中序遍歷與後序遍歷構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNod

資料結構8種排序的比較

  直接插入排序 ①所給元素越接近有序,直接插入排序的時間效率越高 ②時間複雜度: O(N^2) ③空間複雜度: O(1) ④穩定性: 穩定 希爾排序 ①希爾排序是對直接插入排序的優化  ②當gap >

資料結構希爾排序(ShellSort)

  概念: 希爾排序法,又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數, 把待排序檔案中所有資料分成幾個組,所有距離為gap的資料分在同一組內,並對每一組內的資料進行排序。 然後,去重複上述分組和排序的工作。當到達gap=1時,所有資料在一組內

資料結構直接插入排序

概念:       直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一一個新的有序序列。 核心思想:     &nb

資料結構計數排序

概念: 計數排序,又稱為鴿巢原理,是對雜湊定址法的變形應用。 核心思想是: 具體程式碼如下: void CountSort(int* a, int n)//計數排序 { int max = a[0]; int min = a[0]; for (in

資料結構環形連結串列

給定一個連結串列,判斷連結串列中是否有環。 思路分析: 判斷連結串列是否帶環,實際上歸屬於快慢指標問題,快指標先進環,慢指標後進環,然後快指標和慢指標最終會在環裡面相遇,如果不會相遇,則表示不是迴圈連結串列,也就是說到頭了,即不帶環。 具體程式碼如下: /**