日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构:邻接矩阵

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:邻接矩阵 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建鄰接矩陣,其實在離散數學中我們已經學過了,這里只是把它邊的代碼化了;這里就以下面這個簡簡單單的圖為例子來講怎么創建一個鄰接矩陣吧。

這里分有向圖和無向圖來討論

1.無向圖和無向圖的鄰接矩陣

?由于無向圖和無向圖的邊都是沒有權值的,所以我們用1表示某兩頂點之間有邊存在,用0表示這兩邊是沒有邊存在的。

首先,我們看G2,他有4個頂點,所以,我們用一個(n*n)5*5的數組來存這個圖,也就是說,我們要建一個這么大的鄰接矩陣;

行就分別表示v1 v2 v3 v4;

列也是v1 v2 v3 v4;

我們需要了解的一點就是!v(i,j)表示vi到vj之間是否有邊;

  • 先看v1這個頂點,他和v2? ?v4相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?看第一行(也就是v1這一行),找到v2和v4下面都寫上1;
  • ?再看v2這個頂點,他和v1? ? v3? ? v5相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?看第二行(也就是v2這一行),找到v1和v3、v5下面都寫上1;
  • 再看v3這個頂點,他和v2? ?v4? ?v5相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?我們看第三行(也就是v3這一行),找到v2和v4、v5下面都寫上1;
  • 看v4這個頂點,他和v1 ? v3相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 看第四行(也就是v4這一行),找到v1和v3下面都寫上1;
  • 看v5這個頂點,他和v2 ? v3相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?看第五行(也就是v5這一行),找到v2和v3下面都寫上1;

然后我們再看G1,就是同理,因為G1是一個有向圖,也就是同理,只不過有向圖他兩點之間是用箭頭鏈接,這樣我們只要看,誰指向誰,就說明這兩個之間是聯通的。

v<i,j>就表示i到j之間是否為通的。

這里的G1,4個頂點,聰明的你一個會舉一反三了吧,哈哈哈哈,就是和上面那個一樣的,答案已經在上面給出了奧,

下面我們就看代碼吧:

#include<iostraem> #include<malloc> #include<string> #include<cstring> #define MVNum 100; typedef VerTexType char; using namespace std; //鄰接矩陣(數組/順序存儲) typedef struct {VerTexType vexs[MVNum];//頂點表Arctype arcs[MVNum][MVNum];//鄰接表,,記得初始化為0奧,我這里沒有寫了int vexnum,arcnum;//分別表示頂點數和邊的數量 }AMGraph;int Locate(AmGraph G,VerTexType u){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==u)return i;}return -1; } Status CreateUDN(AMGraph &G){cin>>G.vexnum>>G.arcnum;for(int i=0;i<G.vexnum;i++)cin>>G.vexs[i];for(int i=0;i<G.arcnum;i++)for(int j=0;j<G.arcnum;j++){G.arcs[i][j]=INT_MAX;}VerTexType v1,v2;int i,j,w;for(int k=0;k<G.arcnum;k++){cin>>v1>>v2;i=Locate(G,v1);j=Locate(G,v2);G.arcs[i][j]=1;G.arcs[i][j]=G.arcs[j][i];}return 1; }

2.網的鄰接矩陣

接下來是網的鄰接矩陣了,這里注意就是,鏈接兩點的邊如果有權值我們就把他叫做網,這時候,鄰接矩陣中對應得v[i][j]就不是表示存不存在邊了,而是寫他這一條邊的權值:

方法還是和上面的一樣,只不過這里把沒有邊改成了無窮大;方便我們做后面的算法;

?下面我們就看看代碼把

#include<iostraem> #include<malloc> #include<string> #include<cstring> #define MVNum 100; typedef VerTexType char; using namespace std; //鄰接矩陣(數組/順序存儲) typedef struct {VerTexType vexs[MVNum];//頂點表Arctype arcs[MVNum][MVNum];//鄰接表int vexnum,arcnum;//分別表示頂點數和邊的數量 }AMGraph;int Locate(AmGraph G,VerTexType u){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==u)return i;}return -1; } Status CreateUDN(AMGraph &G){cin>>G.vexnum>>G.arcnum;for(int i=0;i<G.vexnum;i++)cin>>G.vexs[i];for(int i=0;i<G.arcnum;i++)for(int j=0;j<G.arcnum;j++){G.arcs[i][j]=INT_MAX;}VerTexType v1,v2;int i,j,w;for(int k=0;k<G.arcnum;k++){cin>>v1>>v2>>w;i=Locate(G,v1);j=Locate(G,v2);G.arcs[i][j]=w;G.arcs[i][j]=G.arcs[j][i];}return 1; }

嗯............那我們就總結一下這個鄰接矩陣得優點和去缺點吧

一、優點:
1. 直觀,簡單,好理解
2.方便查找某兩邊之間是否存在邊
3.方便尋找某一頂點直接相鄰的點
4.方便計算各個頂點的入度和出度
二、缺點:
1.不利于增加和刪除頂點;
2.浪費空間——特別在稀疏圖中
3.浪費時間——比如統計圖中邊的數目

總結

以上是生活随笔為你收集整理的数据结构:邻接矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。