图的基本操作及其相关应用
生活随笔
收集整理的這篇文章主要介紹了
图的基本操作及其相关应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、圖的存儲結構
- 有向圖的鄰接矩陣存儲
- 無向圖的鄰接表存儲
- 二、圖的遍歷
- 2.1 深度優先搜索(DFS)
- 2.2 廣度優先搜索(BFS)
- 三、圖的連通性
- 3.1 連通分量和生成樹
- 3.2 最小生成樹
- 普里姆(Prim)算法
- 克魯斯卡爾 (Kruskal) 算法
- 四、有向無環圖及其應用
- 拓撲排序
- 關鍵路徑
- 五、最短路徑
一、圖的存儲結構
有向圖的鄰接矩陣存儲
//鄰接矩陣 typedef struct {VertexType vexs[MAX_VERTAX_NUM];AdjMatrix arcs[MAX_VERTAX_NUM][MAX_VERTAX_NUM];int vexnum, arcnum; }MGraph;int LocateVex(MGraph G, VertexType e) {int i;for (i = 0; i < G.vexnum; i++){if (G.vexs[i] == e)return i;}return -1; }Status CreateDG(MGraph& G) {int i, j, k;char v1, v2;cout << "請輸入圖的頂點個數(vexnum),邊數(arcnum)";cin >> G.vexnum >> G.arcnum;getchar();cout << "請輸入頂點(例:abcd):";for (i = 0; i < G.vexnum; i++)G.vexs[i] = getchar();getchar();for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++)G.arcs[i][j] = INFINITYA;for (k = 0; k < G.arcnum; k++){cout << k;cout << "請輸入兩個頂點:";cin >> v1 >> v2;getchar();i = LocateVex(G, v1);j = LocateVex(G, v2);G.arcs[i][j] = 1;}return OK; }無向圖的鄰接表存儲
#define MAX_VERTAX_NUM 20 //最大頂點個數 typedef char Vertextype; //鄰接表類型 typedef struct ArcNode {int adjvex; //鄰接點域 struct ArcNode* nextarc; //指向下一個鄰接點的指針域 }ArcNode; //表頭結點類型 typedef struct VNode {Vertextype data; //頂點域 ArcNode* firstarc; //邊表頭指針 }VNode, AdjList[MAX_VERTAX_NUM]; //圖的類型 typedef struct {AdjList vertices; //鄰接表 int vexnum, arcnum; //頂點數 邊數 //int kind; }ALGraph; typedef struct CSNode {Vertextype e;CSNode* lchild, * nextsibling; }CSNode, * CSTree; int visited[MAX_VERTAX_NUM];int LocateVex(ALGraph G, char e) {int i;for (i = 0; i < G.vexnum; i++){if (G.vertices[i].data == e)return i;}return -1; }void CreateUDG(ALGraph& G) {int i, k, j;ArcNode* p, * s;char v1, v2; // printf("圖的種類已默認為無向圖\n"); // G.kind = 1;printf("請輸入頂點數和邊數:(空格區分)");scanf("%d%d", &G.vexnum, &G.arcnum);getchar();printf("開始建立頂點表\n");for (i = 0; i < G.vexnum; i++){printf("請輸入第%d個頂點的信息:", i + 1);G.vertices[i].data = getchar();getchar();G.vertices[i].firstarc = NULL;}printf("建立邊表\n");for (k = 0; k < G.arcnum; k++){printf("請輸入兩個頂點(例:ab代表a~b):");scanf("%c%c", &v1, &v2);getchar();i = LocateVex(G, v1);j = LocateVex(G, v2);p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc = p;s = (ArcNode*)malloc(sizeof(ArcNode));s->adjvex = i;s->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc = s;}printf("邊表建立完成\n"); } //打印鄰接表 void DispGraph(ALGraph G) {int i;printf("打印鄰接表:\n");for (i = 0; i < G.vexnum; i++){printf("%d->", i);while (1){if (G.vertices[i].firstarc == NULL){printf("^");break;}printf("%d->", G.vertices[i].firstarc->adjvex);G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc;}printf("\n");} }二、圖的遍歷
2.1 深度優先搜索(DFS)
https://blog.csdn.net/qq_46672746/article/details/118097444
2.2 廣度優先搜索(BFS)
https://blog.csdn.net/qq_46672746/article/details/118097444
三、圖的連通性
3.1 連通分量和生成樹
3.2 最小生成樹
普里姆(Prim)算法
克魯斯卡爾 (Kruskal) 算法
四、有向無環圖及其應用
拓撲排序
關鍵路徑
五、最短路徑
總結
以上是生活随笔為你收集整理的图的基本操作及其相关应用的全部內容,希望文章能夠幫你解決所遇到的問題。