1. 程式人生 > >圖的表示方法和C++實現

圖的表示方法和C++實現

圖的表示最長用的兩種方法是:

1)、鄰接矩陣表示法

2)、鄰接表表示

下面是兩種構造圖的方法

1)鄰接矩陣:

  1. #include <iostream>
  2. #include <vector>
  3. usingnamespace std;  
  4. //列舉型別,圖的種類 DG:有向圖;WDG:帶權值的有向圖;
  5. //UDG: 無向圖;WUDG: 帶權值的無向圖
  6. enum GraphKind {DG, WDG, UDG, WUDG};  
  7. //vertexType頂點型別,VRType:頂點之間的關係型別,InfoType:弧的資訊型別
  8. template
     <typename VertexType, typename VRType, typename InfoType>  
  9. class MGraph  
  10. {  
  11. public:  
  12.     MGraph(int vexNum, GraphKind __kind) : vexnum(vexNum), arcnum(0), kind(__kind)  
  13.     {  
  14.         //分配頂點向量陣列
  15.         vvec = new VertexType[vexnum];  
  16.         //動態分配二維陣列, 注意二維陣列的動態分配
  17.         arcs = new
     ArcCell *[vexnum];  
  18.         for (int i = 0; i < vexnum; i++)  
  19.         {  
  20.             //為每一行動態分配空間
  21.             arcs[i] = new ArcCell[vexnum];  
  22.         }  
  23.     }  
  24.     void Create()  
  25.     {  
  26.         switch (kind)  
  27.         {  
  28.         case DG:   
  29.             {  
  30.                 CreateDG();    //構造一個有向圖
  31.                 break;  
  32.             }             
  33.         case WDG:  
  34.             {  
  35.                 CreateWDG();    //構造一個帶權有向圖
  36.                 break;  
  37.             }  
  38.         case UDG:  
  39.             {  
  40.                 CreateUDG();    //構造一個無向圖
  41.                 break;  
  42.             }  
  43.         case WUDG:  
  44.             {   
  45.                 CreateWUDG();   //構造一個帶權無向圖
  46.                 break;  
  47.             }  
  48.         default:  
  49.             return;  
  50.         }  
  51.     }  
  52.     //初始化頂點陣列和鄰接矩陣
  53.     void Init()  
  54.     {  
  55.         cout << "請輸入每個頂點的關鍵字:" << endl;  
  56.         VertexType val;  
  57.         for (int i = 0; i < vexnum; i++)  
  58.         {  
  59.             cin >> val;  
  60.             vvec[i] = val;  
  61.         }  
  62.         for (int i = 0; i < vexnum; i++)  
  63.         {  
  64.             ArcCell ac;  
  65.             ac.adj = 0;  
  66.             ac.info = NULL;  
  67.             for (int j = 0; j < vexnum; j++)  
  68.             {             
  69.                 arcs[i][j] = ac;  
  70.             }  
  71.         }  
  72.     }  
  73.     //構造一個有向圖
  74.     void CreateDG()  
  75.     {  
  76.         Init();  
  77.         int vhead, vtail;  
  78.         cout << "請依次輸入每條邊的開始頂點和結束頂點:" << endl;  
  79.         while (cin >> vhead >> vtail)  
  80.         {  
  81.             arcnum++;  
  82.             arcs[vhead][vtail].adj = 1;  
  83.         }  
  84.     }  
  85.     //構造一個帶權有向圖
  86.     void CreateWDG()  
  87.     {  
  88.         Init();  
  89.         int vhead, vtail;  
  90.         InfoType w;  
  91.         cout << "請依次輸入每條邊的開始頂點和結束頂點和權值:" << endl;  
  92.         while (cin >> vhead >> vtail >> w)  
  93.         {  
  94.             arcnum++;  
  95.             arcs[vhead][vtail].adj = w;  
  96.         }  
  97.     }  
  98.     //構造一個無向圖
  99.     void CreateUDG()  
  100.     {  
  101.         Init();  
  102.         int vhead, vtail;  
  103.         cout << "請依次輸入每條邊的開始頂點和結束頂點:" << endl;  
  104.         while (cin >> vhead >> vtail)  
  105.         {  
  106.             arcnum += 2;  
  107.             arcs[vhead][vtail].adj  = 1;  
  108.             arcs[vtail][vhead].adj  = 1;  
  109.         }  
  110.     }  
  111.     //構造一個帶權無向圖
  112.     void CreateWUDG()  
  113.     {  
  114.         Init();  
  115.         int vhead, vtail;  
  116.         InfoType w;  
  117.         cout << "請依次輸入每條邊的開始頂點和結束頂點和權值:" << endl;  
  118.         while (cin >> vhead >> vtail >> w)  
  119.         {  
  120.             arcnum += 2;  
  121.             arcs[vhead][vtail].adj = w;  
  122.             arcs[vtail][vhead].adj = w;  
  123.         }  
  124.     }  
  125.     void displayGraph()  
  126.     {  
  127.         cout << "總共有" << vexnum << 

    相關推薦

    表示方法C++實現

    圖的表示最長用的兩種方法是: 1)、鄰接矩陣表示法 2)、鄰接表表示 下面是兩種構造圖的方法 1)鄰接矩陣: #include <iostream> #include <vector> us

    資料結構中,幾種樹的結構表示方法C語言實現

    //***************************************** //樹的多種結構定義 //***************************************** #define MAX_TREE_SIZE 100 typedef int TempType;

    線性代數-矩陣-加減 CC++實現

    for 通過 turn oba c語言 bsp operator column name 原理解析: (此處補圖) 本節編寫矩陣的加法和減法,兩個矩陣相加,即把兩個相同大小的矩陣對應的元素分別相加 。兩個矩陣相減,把兩個相同大小矩陣的對應元素分別相減。 C++語言: 矩

    線性代數-矩陣-【5】矩陣化簡 CC++實現

    tar tput c++ spec 但是 exc c++語言 emp opened 點擊這裏可以跳轉至 【1】矩陣匯總:http://www.cnblogs.com/HongYi-Liang/p/7287369.html 【2】矩陣生成:http://www.cnblog

    編程之美—象棋將帥問題javaC++實現

    象棋解決思路這樣如下圖:然後我的java實現public class xiangqi { public static void main(String[] args) { byte s=81; while(s!=0){ if((s/9%3)==(

    最簡單的排序算法(CC++實現

    最簡單的排序算法(C和C++實現)1、算法思想如下圖:把待排序的數都存在對應的數組的下標中,如果待排序的數有重復的,就用對應的數組加一,最後把數組的下標打印出來即可。2、源碼(C)如下:#include <stdio.h>int main (void){ int a[100], i, j,

    設計模式—模板方法C++實現

    構圖 操作 clust urn out 數據統計 pac 技術 soft 這是Bwar在2009年寫的設計模式C++實現,代碼均可編譯可運行,一直存在自己的電腦裏,曾經在團隊技術分享中分享過,現搬到線上來。 1. 模板方法簡述 1.1 目的 定義一個

    LBP特徵MatlabC實現

    LBP特徵成為區域性二值模式,具有旋轉不變性,不受光照影響 主要分為一下幾個步驟: 1.中心點鄰域內8個畫素,以中心點畫素值為閾值,鄰域內八個畫素值大於中心點畫素值即為1,小於中心點畫素值即為0 2.周圍八個畫素點形成一個八位的二進位制串比如11111111,即為255,0000

    1049 數列的片段 ——c實現

    1049 數列的片段和 (20 分) 給定一個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列 { 0.1, 0.2, 0.3, 0.4 },我們有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (

    Leetcode 929 獨特的電子郵件(PythonC++實現

    每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。 例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。 除了小寫字母,這些電子郵件還可能包含 ','

    檢測Android模擬器的方法程式碼實現

    專自:https://bbs.pediy.com/thread-225717.htm 剛剛看了一些關於Detect Android Emulator的開源專案/文章/論文, 我看的這些其實都是13年14年提出的方法, 方法裡大多是檢測一些環境屬性, 檢查一些檔案這樣, 但實際上檢測的思路並不侷限

    快速排序c c++實現

    #include <iostream> #include <vector>   using namespace std;   void Qsort(int a[], int low, int high) {     if(

    LeetCode- 16. 最接近的三數之和 (Medium)pythonc++實現

    給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如,給定陣列 n

    python c++實現旋轉矩陣到尤拉角的變換

    在攝影測量學科中,國際攝影測量遵循OPK系統,即是xyz轉角系統,而工業中往往使用zyx轉角系統。 旋轉矩陣的意義:描述相對地面的旋轉情況,yaw-pitch-roll對應zyx對應k,p,w #inc

    Leetcode 929 獨特的電子郵件(PythonC++實現

    每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。 例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。 除了小寫字母,這些電子郵件還可能包含 ',' 或 '+'。 如果在電子郵件地址的本

    NDK[2]Java方法C方法 C方法到Java方法

    【參考連結】程式執行時,以主執行緒的main()方法為入口,不停的從一個方法呼叫到另一個方法中,方法返回再繼續呼叫其他的根據之前JVM的知識,其實就是在不停向棧中壓入棧幀、彈出棧幀所以既可以在java方法中呼叫C/C++方法,也可以在C/C++方法中呼叫Java方法,只不過這

    陣列排序方法C實現的總結

    1、問題描述     陣列排序(即按某種特定的順序排列資料,如升序或降序)是最重要的計算應用之一,銀行用帳號對所有的支票進行能夠排序,並根據排序結果準備月底的財務報告,學校學生成績管理系統用陣列排序的方法將考試成績從高到低進行排名,陣列排序方法很多,有直接插入排序、氣泡排序

    基於OpenCVC++實現最大閾值分割演算法

    程式碼如下:: /********************************************************************************************************** *檔案說明: * 基於Ope

    白話貝葉斯理論及在足球比賽結果預測中的應用C#實現

          貝葉斯分類的基礎是概率推理,就是在各種條件的存在不確定,僅知其出現概率的情況下,如何完成推理和決策任務。概率推理是與確定性推理相對應的。而樸素貝葉斯分類器是基於獨立假設的,即假設樣本每個特徵與其他特徵都不相關。舉個例子,如果一種水果其具有紅,圓,直徑大概4英寸等特徵,該水果可以被判定為是蘋果。

    動態規劃演算法c++實現 國王與金礦問題

    這個連結講解動態規劃通俗易懂:https://blog.csdn.net/baidu_37107022/article/details/73188963 https://blog.csdn.net/baidu_37107022/article/details/7318912