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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的邻接矩阵(C语言)

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的邻接矩阵(C语言) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鄰接矩陣


無向圖和有向圖在鄰接矩陣中的表示方法:

無向圖和有向圖大同小異,在這里只以無向圖為例,代碼部分通過簡單調(diào)整即可對應(yīng)編譯有向圖

鄰接矩陣數(shù)據(jù)類型定義

#define MaxVertices 100 //定義最大容量 typedef struct{ //包含權(quán)的鄰接矩陣的的定義int Vertices[MaxVertices]; //頂點信息的數(shù)組int Edge[MaxVertices][MaxVertices]; //邊信息的數(shù)組int numV; //頂點數(shù)int numE; //邊數(shù) }AdjMatrix;

以如關(guān)系圖為例

根據(jù)上圖,我們可以寫出對應(yīng)的鄰接矩陣:

通過這個圖可以看出,無向圖對角線劃分出來的兩部分是互相對稱的,由此即可通過創(chuàng)建無向圖的鄰接矩陣:

void CreateGraph(AdjMatrix *G) //圖的生成函數(shù) { int n,e,vi,vj,w,i,j;printf("請輸入圖的頂點數(shù)和邊數(shù)(以空格分隔):");scanf("%d%d",&n,&e);G->numV=n;G->numE=e;for(i=0;i<n;i++) //圖的初始化for(j=0;j<n;j++){ if(i==j)G->Edge[i][j]=0;else G->Edge[i][j]=32767;}for(i=0;i<G->numV;i++) //將頂點存入數(shù)組中{ printf("請輸入第%d個頂點的信息:",i+1);scanf("%d",&G->Vertices[i]);}printf("\n");for(i=0;i<G->numE;i++){ printf("請輸入邊的信息i,j,w(以空格分隔):");scanf("%d%d%d",&vi,&vj,&w); //若為不帶權(quán)值的圖,則w輸入1//若為帶權(quán)值的圖,則w輸入對應(yīng)權(quán)值G->Edge[vi-1][vj-1]=w;//①G->Edge[vj-1][vi-1]=w;//②//無向圖具有對稱性的規(guī)律,通過①②實現(xiàn)//有向圖不具備此性質(zhì),所以只需要①} }

創(chuàng)建完無向圖對應(yīng)的鄰接矩陣,我們需要對輸出的格式進行一下控制,使其盡量按照普通手寫的方式輸出

void DispGraph(AdjMatrix G) //輸出鄰接矩陣的信息 { int i,j;printf("\n輸出頂點的信息(整型):\n");for(i=0;i<G.numV;i++)printf("%8d",G.Vertices[i]);printf("\n輸出鄰接矩陣:\n");printf("\t");for(i=0;i<G.numV;i++)printf("%8d",G.Vertices[i]);for(i=0;i<G.numV;i++){ printf("\n%8d",i+1);for(j=0;j<G.numV;j++){ if(G.Edge[i][j]==32767) //兩點之間無連接時權(quán)值為默認(rèn)的32767,但輸出時為了方便輸出 "∞"printf("%8s", "∞");elseprintf("%8d",G.Edge[i][j]);}printf("\n"); } }

完整程序如下:

#include<stdio.h> #include<stdlib.h> #define MaxVertices 100 //假設(shè)包含100個頂點 #define MaxWeight 32767 //不鄰接時為32767,但輸出時用 "∞" typedef struct{ //包含權(quán)的鄰接矩陣的的定義int Vertices[MaxVertices]; //頂點信息的數(shù)組int Edge[MaxVertices][MaxVertices]; //邊的權(quán)信息的數(shù)組int numV; //當(dāng)前的頂點數(shù)int numE; //當(dāng)前的邊數(shù) }AdjMatrix;void CreateGraph(AdjMatrix *G) //圖的生成函數(shù) { int n,e,vi,vj,w,i,j;printf("請輸入圖的頂點數(shù)和邊數(shù)(以空格分隔):");scanf("%d%d",&n,&e);G->numV=n;G->numE=e;for(i=0;i<n;i++) //圖的初始化for(j=0;j<n;j++){ if(i==j)G->Edge[i][j]=0;else G->Edge[i][j]=32767;}for(i=0;i<G->numV;i++) //將頂點存入數(shù)組中{ printf("請輸入第%d個頂點的信息(整型):",i+1);scanf("%d",&G->Vertices[i]);}printf("\n");for(i=0;i<G->numE;i++){ printf("請輸入邊的信息i,j,w(以空格分隔):");scanf("%d%d%d",&vi,&vj,&w); //若為不帶權(quán)值的圖,則w輸入1//若為帶權(quán)值的圖,則w輸入對應(yīng)權(quán)值G->Edge[vi-1][vj-1]=w;//①G->Edge[vj-1][vi-1]=w;//②//無向圖具有對稱性的規(guī)律,通過①②實現(xiàn)//有向圖不具備此性質(zhì),所以只需要①} } void DispGraph(AdjMatrix G) //輸出鄰接矩陣的信息 { int i,j;printf("\n輸出頂點的信息(整型):\n");for(i=0;i<G.numV;i++)printf("%8d",G.Vertices[i]);printf("\n輸出鄰接矩陣:\n");printf("\t");for(i=0;i<G.numV;i++)printf("%8d",G.Vertices[i]);for(i=0;i<G.numV;i++){ printf("\n%8d",i+1);for(j=0;j<G.numV;j++){ if(G.Edge[i][j]==32767) //兩點之間無連接時權(quán)值為默認(rèn)的32767,在無向圖中一般用"0"表示,在有向圖中一般用"∞",這里為了方便統(tǒng)一輸出 "∞"printf("%8s", "∞");elseprintf("%8d",G.Edge[i][j]);}printf("\n"); } } int main() { AdjMatrix G;CreateGraph(&G);DispGraph(G); }

運行結(jié)果如下:

總結(jié)

以上是生活随笔為你收集整理的图的邻接矩阵(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。