1. 程式人生 > >圖的鄰接矩陣(C語言)

圖的鄰接矩陣(C語言)

鄰接矩陣

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

無向圖和有向圖大同小異,在這裡只以無向圖為例,程式碼部分通過簡單調整即可對應編譯有向圖

鄰接矩陣資料型別定義

#define MaxVertices 100 //定義最大容量
typedef struct{ //包含權的鄰接矩陣的的定義
    int Vertices[MaxVertices];  //頂點資訊的陣列
    int Edge[MaxVertices][MaxVertices]; //邊資訊的陣列
    int numV; //頂點數
    int numE; //邊數
}AdjMatrix;

以如關係圖為例
鄰接矩陣關係圖
根據上圖,我們可以寫出對應的鄰接矩陣:
鄰接矩陣手寫


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

void CreateGraph(AdjMatrix *G) //圖的生成函式
{ 
    int n,e,vi,vj,w,i,j;
    printf("請輸入圖的頂點數和邊數(以空格分隔):");
    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++) //將頂點存入陣列中 { 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); //若為不帶權值的圖,則w輸入1 //若為帶權值的圖,則w輸入對應權值 G->Edge[vi-1][vj-1]=w;//① G->Edge[vj-1][vi-1]=w;//② //無向圖具有對稱性的規律,通過①②實現 //有向圖不具備此性質,所以只需要① } }

建立完無向圖對應的鄰接矩陣,我們需要對輸出的格式進行一下控制,使其儘量按照普通手寫的方式輸出

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) //兩點之間無連線時權值為預設的32767,但輸出時為了方便輸出 "∞"
            printf("%8s", "∞");
        else
            printf("%8d",G.Edge[i][j]);
        }
        printf("\n");   
    }
}

完整程式如下:

#include<stdio.h>
#include<stdlib.h>
#define MaxVertices 100 //假設包含100個頂點
#define MaxWeight 32767 //不鄰接時為32767,但輸出時用 "∞"
typedef struct{ //包含權的鄰接矩陣的的定義
    int Vertices[MaxVertices];  //頂點資訊的陣列
    int Edge[MaxVertices][MaxVertices]; //邊的權資訊的陣列
    int numV; //當前的頂點數
    int numE; //當前的邊數
}AdjMatrix;

void CreateGraph(AdjMatrix *G) //圖的生成函式
{ 
    int n,e,vi,vj,w,i,j;
    printf("請輸入圖的頂點數和邊數(以空格分隔):");
    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++) //將頂點存入陣列中
        { 
            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); 
        //若為不帶權值的圖,則w輸入1
        //若為帶權值的圖,則w輸入對應權值

        G->Edge[vi-1][vj-1]=w;//①
        G->Edge[vj-1][vi-1]=w;//②
        //無向圖具有對稱性的規律,通過①②實現
        //有向圖不具備此性質,所以只需要①
    }
}
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) 
        //兩點之間無連線時權值為預設的32767,
        在無向圖中一般用"0"表示,在有向圖中一般用"∞",
        這裡為了方便統一輸出 "∞"
            printf("%8s", "∞");
        else
            printf("%8d",G.Edge[i][j]);
        }
        printf("\n");   
    }
}
int main()
{ 
    AdjMatrix G;
    CreateGraph(&G);
    DispGraph(G);
}

執行結果如下:
這裡寫圖片描述

相關推薦

鄰接矩陣C語言

鄰接矩陣 無向圖和有向圖在鄰接矩陣中的表示方法: 無向圖和有向圖大同小異,在這裡只以無向圖為例,程式碼部分通過簡單調整即可對應編譯有向圖 鄰接矩陣資料型別定義 #define Max

鄰接表表示法C語言

鄰接表 鄰接表資料結構型別如下: #define MaxVertices 100 typedef struct node{ //邊表 int adjvex; node*

的四色著色C語言

2017計算機學碩複試真題 用四種顏色給地圖著色,要求相鄰塊顏色不同,圖用鄰接矩陣儲存,求所有著色方案。 思路: (草稿) 遞迴,如用下圖,做出鄰接矩陣: map[N][N] = {   0,1,1,0,1, 1,0,1,0,1, 1,1,0,1,0, 0,0,1,0

資料結構——稀疏矩陣運算器C語言

資料結構——稀疏矩陣運算器(C語言) /*****************稀疏矩陣運算器 ****************/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define TRUE

演算法7-6:的遍歷——廣度優先搜尋c語言

[提交] [統計] [提問] 題目描述 廣度優先搜尋遍歷類似於樹的按層次遍歷的過程。其過程為:假設從圖中的某頂點v出發,在訪問了v之後依次訪問v的各個未曾被訪問過的鄰接點,然後分別從這些鄰接點出發依次訪問它們的鄰接點,並使“先被訪問的頂點的鄰接點”先於“後被訪問的頂點的鄰接點”被訪問

演算法7-4,7-5:的遍歷——深度優先搜尋c語言

[提交] [統計] [提問] 題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都

PTA-矩陣運算C語言

#include <stdio.h> int main(){ int n,sum=0; scanf("%d",&n); int mov[n][n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++)

實驗四,無向+鄰接矩陣BFS,DFS遞迴+非遞迴,有向+鄰接BFS,DFS遞迴+非遞迴,拓撲排序

//Sinhaeng Hhjian #include<bits/stdc++.h> using namespace std; const int N=100; const int MAX=1000; int book[N], cnt; struct node{

7-13 日K蠟燭C語言

股票價格漲跌趨勢,常用蠟燭圖技術中的K線圖來表示,分為按日的日K線、按周的周K線、按月的月K線等。以日K線為例,每天股票價格從開盤到收盤走完一天,對應一根蠟燭小圖,要表示四個價格:開盤價格Open(早上剛剛開始開盤買賣成交的第1筆價格)、收盤價格Close(下午收盤時最後一筆

LeetCode 59. 螺旋矩陣 II Spiral Matrix IIC語言

題目描述: 給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。 示例: 輸入: 3 輸出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 題目解答: 方法1:遍歷

LeetCode 54. 螺旋矩陣 Spiral MatrixC語言

題目描述: 給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。 示例 1: 輸入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 輸出: [1,2,3,6,9,8,7,4,5]

| 儲存結構:鄰接矩陣C語言實現

使用圖結構表示的資料元素之間雖然具有“多對多”的關係,但是同樣可以採用順序儲存,也就是使用陣列有效地儲存圖。 鄰接矩陣 鄰接矩陣(Adjacency Matrix),又稱 陣列表示法,儲存方式是用兩個陣列來表示圖: 一個一維陣列儲存圖中頂點本身資訊

鄰接表的建立與輸出C語言

鄰接表是圖的常用儲存結構之一,它很好的解決了鄰接矩陣佔用空間較大的問題。 鄰接表用到了兩個結構體,一個是頂點表,包括點的序號和連線此起點的第一條邊。一個是邊表,包括連線此邊的終點和對應之前起點的下一條邊。 初始化鄰接表時,先將定點表賦值,並把指標指向NULL。再將輸入的資料

稀疏矩陣利用三元組相乘c語言

被這個稀疏矩陣折磨了很久,看了將近一個半禮拜,看的我很想撕書。 這個是程式思想是和資料結構(c語言版)機械工業出版社的學習的,書 程式碼講解不是很詳細,搜了網上很多程式碼,都是抄了一下,草草註釋,在我自己寫的時候發現書上的程式碼是有問題的。 書上p48,ne

自己主動化測試程序之中的一個自己定義鍵盤的模擬測試程序C語言

nds per oid 尾指針 應用 tro scan number 實現 一、測試程序編寫說明 我們做的終端設備上運行的是QT應用程序。使用自己定義的鍵盤接口。經過測試人員長時間的人機交互測試,來確認系統的功能是否滿足需求。如今須要編寫一個自己主動化

3、簡單計算機程序C語言

can ext class log cnblogs c語言 輸入 char 計算機程序 簡單計算機程序 程序代碼: /* 2017年6月30日15:35:14 功能:計算器程序,輸入兩個運算數與四則運算符,輸出計算結果 */ # include <stdio.h

自動生成小學生四則運算C語言

.html .com 它的 百度 http htm log hub .cn 我寫的這個自動生成小學生四則運算的代碼是根據我在百度上看到的一篇博客改的,地址為http://www.cnblogs.com/ys1101/p/4368103.html。它的功能不夠完整,只有整數的

終於把貪食蛇弄出來了C語言

inf pos 容易 發布 com 初學 總結 info src 真不容易,小小的貪食蛇,居然這麽有難度。 從圖片可以看出,卡頓,閃爍比較嚴重,而且比較簡陋。 初學者,做成這樣,我覺得還算不錯,恩繼續學習。 額,代碼先不貼了,先總結一下,整理好之後再發布終於把貪食蛇弄出來

【最全】經典排序算法C語言

排好序 而不是 lock wap 循環 而且 -s 關鍵字 void 本文章包括所有基本排序算法(和其中一些算法的改進算法): 直接插入排序、希爾排序、直接選擇排序、堆排序、冒泡排序、快速排序、歸並排序、基數排序。 算法復雜度比較: 算法分類 一、直接插入排序 一個

樹莓派超聲波測距+蜂鳴器c語言

mic 程序 老師 SM tput measure github stop 一個   前邊我們已經詳細的講解了樹莓派控制超聲波模塊測距(http://www.cnblogs.com/yuemo/p/8888342.html)和超聲波控制蜂鳴器模塊發聲(http://www.