圖(1)--圖的相關術語與圖的儲存結構
一:圖的基本術語:
1.無向圖:圖G中的每條邊都是無方向的
2.有向圖:圖G中的每條邊都是有方向的;
3.完全圖:圖G任意兩個頂點都有一條邊相連線;
4.有向完全圖:若n個頂點的有向圖有n(n-1)條邊, 稱為有向完全圖
5.簡單路徑:路徑上各頂點 v1,v2,...,vm 均不互相重複
6.迴路(環):路徑上第一個頂點 v1 與最後一個頂點vm 重合
7.連通圖:圖中任意一對頂點都是連通的, 則稱此圖是連通圖
8.強連通圖:有向圖中, 若對於每一對頂點vi和vj, 都存在一條從vi到vj和從vj到vi的路徑, 則稱此圖是強連通圖。
9.頂點的度:頂點V的度 TD(v) = ID(v) + OD(v) ID表示入度 OD表示出度
10.生成樹: 一個連通圖的生成樹是一個極小連通子圖,它含有圖中全部頂點,但只有足以構成一棵樹的n-1條邊
二.圖的儲存結構:
1.鄰接矩陣儲存
(1)無向圖(有向也一樣,不對稱而已)
A[i][j]=1表示頂點Vi和Vj之間有邊相連
(2)帶權圖(有向無向一樣理解)
(3)儲存結構:
#define INFINITY INT_MAX // 最大值∞
#define MAX_VERTEX_NUM 20 // 最大頂點個數
typedef enum {DG, DN, UDG, UDN} GraphKind;
//圖型別(有向圖/網,無向圖/網)
typedef struct ArcCell {//弧資訊
VRType adj; // 頂點的關係型別。對無權圖,用1或0表示相鄰否;對帶權圖,則為權值型別,adj表示權值
InfoType *info; // 指向該弧相關資訊的指標(如果有其他資訊,則指向它)
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 描述頂點的陣列
AdjMatrix arcs; // 鄰接矩陣
int vexnum, arcnum; // 圖的當前頂點數和弧(邊)數
GraphKind kind; // 圖的種類標誌
} MGraph;
以建立無向網圖為例來理解這種結構:Status CreateUDN(MGraph &G){
sacnf( &G.vexnum, &G.arcnum, &IncInfo);
for(i=0;i<G.vexnum;++i) scanf(&G.vexs[i]); //構造頂點向量
for(i=0;i<G.vexnum;++i) //初始化鄰接矩陣
for(j=0;j<G.vexnum;++j) G.arcs[i][j]={INFINITY,NULL}; // {adj,info}
for(k=0;k<G.arcnum;++k){ //構造鄰接矩陣
scanf(&v1,&v2,&w); //輸入一條邊依附的頂點及權值
i=LocateVex(G,v1);j=LocateVex(G,v2); //找到v1和v2在G中位置
G.arcs[i][j].adj=w;//弧<v1,v2>的權值
if (IncInfo) Input (*G.arcs[i][j].info);//如果IncInfo不為0,則就輸入弧相關資訊
G.arcs[j][i]=G.arcs[i][j]; //置<v1,v2>的對稱弧<v2,v1> }
return OK;
}//CreateUDN
2.鄰接表儲存:
對每個頂點vi 建立一個單連結串列,把與vi 有關聯的邊的資訊(即度或出度邊)連結起來,表中每個結點都設為3個域;
每個單連結串列還應當附設一個頭結點(設為2個域),存vi資訊;每個單連結串列的頭結點另外用順序儲存結構儲存。
例子:
注:因為讀入的結點連線順序不一樣,所以鄰接表不一樣!(有向圖同理)
typedef struct ArcNode
{
int adjvex;//該弧鄰接到的頂點的位置
InfoType *info;//該弧相關資訊的指標(比如說可以使帶權圖的權值)
struct ArcNode* nextArc;
}ArcNode;
typedef struct VNode
{
VertexType data;//頂點的資料資訊
ArcNode* firstArc;//指向第一個依附該結點的弧
}VNode,AdjList[MAX_VERTEX_NUM];//要線性的順序儲存組合在一起,所以採用陣列;
typedef struct ALGraph
{
AdjList vertices;
int verNum,arcNum;//圖的定點數和弧樹
int kind;//圖的種類
}ALGraph;
也是以建立鄰接表圖為例:
void CreateUDN(ALGraph &ga)
{
ArcNode *p;
char name1[40],name2[40];
int i,j,k;
double w;
printf("請輸入頂點數和弧數:");
scanf("%d%d",&ga.vexNum,&ga.arcNum);
printf("請依次輸入頂點名:\n");
for(i=0;i<ga.vexNum;i++)
{
scanf("%s",ga.vertices[i].data);
ga.vertices[i].firstarc=NULL;
}
for(k=0;k<ga.arcNum;k++)
{
printf("請輸入相鄰的兩個定點和權值:");
scanf("%s%s%lf",name1,name2,&w);
i=LocateVex(ga,name1);
j=LocateVex(ga,name2);
p=new ArcNode;
p->adjvex=j;
p->adj=w;
p->nextarc=ga.vertices[i].firstarc;//先進後出式插入
ga.vertices[i].firstarc=p;
}
}
相關文章
- 圖(Graph)——圖的儲存結構
- 【資料結構——圖和圖的儲存結構】資料結構
- php圖的儲存結構PHP
- 【PHP資料結構】圖的概念和儲存結構PHP資料結構
- 圖的儲存
- 圖說HP-lefthand儲存結構
- 各種相關的圖結構-定義及相關研究進展
- 儲存新圖譜:DNA儲存的邊界與天地
- 畫架構圖相關架構
- VC++儲存繪製的圖形-1C++
- 資料結構——圖相關基本概念資料結構
- 【轉】mysql儲存圖片技術決定:儲存二進位制檔案還是隻儲存圖片相對路徑,圖片放在硬碟上面?MySql硬碟
- 圖解vsan儲存結構/資料恢復方法圖解資料恢復
- 資料結構複雜圖形儲存 PHP 版資料結構PHP
- mysql 官方架構相關圖MySql架構
- 教你如何儲存抖音店鋪的商品圖片,自動儲存主圖、詳情圖
- Gantt圖和PERT圖的相關知識
- 儲存圖片
- 圖的儲存與遍歷C++實現C++
- 一篇看懂圖資料庫janusgraph儲存結構資料庫
- 圖解Linux的IO模型和相關技術圖解Linux模型
- C# 截圖並儲存為圖片C#
- 知識圖譜與大模型相結合的3種方法,1+1>2大模型
- 將echarts生成的圖表變為圖片儲存起來Echarts
- 圖結構的相似度度量與分類
- 儲存架構|Haystack太強了!存2600億圖片架構
- cocos2dx之儲存截圖圖片
- 關於圖文識別功能相關技術的大致實現
- Acrobat怎麼批次儲存PDF小圖片?adobe Acrobat一鍵儲存pdf小圖片的技巧BAT
- Acrobat怎麼批量儲存PDF小圖片?adobe Acrobat一鍵儲存pdf小圖片的技巧BAT
- MySQL 資料庫相關流程圖 / 原理圖MySql資料庫流程圖
- 演算法競賽——樹和圖的儲存與遍歷演算法
- 看圖輕鬆理解資料結構與演算法系列(NoSQL儲存-LSM樹)資料結構演算法SQL
- Nebula 架構剖析系列(一)圖資料庫的儲存設計架構資料庫
- 儲存圖片到SD卡SD卡
- asp.net儲存圖片ASP.NET
- python+selenium 截圖儲存Python
- 【CG】圖形學相關
- 【前端】壓縮圖片以及圖片相關概念前端