程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 數據結構(C實現)------- 圖的鄰接矩陣表示

數據結構(C實現)------- 圖的鄰接矩陣表示

編輯:關於C語言

數據結構(C實現)------- 圖的鄰接矩陣表示


 

   鄰接矩陣是表示頂點之間相鄰頂點之間相鄰關系的矩陣。設G=(V,E)是具有n個頂點的圖,若(vi,vj)屬於E,則對應G的鄰接矩陣中的元素A[i][j] = wij 或1,否則,A[i][j] = 0或無窮大,其中,wij可以指邊的權重。

   無向圖或無向網的鄰接矩陣一定是對稱的,因為當(vi,vj)屬於E時,也有(vj,vi)屬於E。而有向圖或有向網的鄰接矩陣不一定對稱,所以用鄰接矩陣表示一個有n個頂點的有向圖或有向網時,所需的存儲空間為n^2。由於無向圖或無向網的鄰接矩陣是對稱的,因此可采用壓縮存儲的方法,僅存儲下三角矩陣(包括主對角線上的元素)中的元素,存儲空間只需n*(n+1)/2。顯然,鄰接矩陣表示法的空間復雜度為s(n) = O(n^2)。

   用鄰接矩陣表示圖,除了存儲用於表示頂點間相鄰關系的鄰接矩陣外,通常還需要一個一維數組存儲頂點信息。設計如下:

 

#define MAX_VEX_NUM 50
typedef char VertexType;
typedef enum {
	DG, UDG
} GraphType;
typedef struct {
	VertexType vexs[MAX_VEX_NUM];
	int arcs[MAX_VEX_NUM][MAX_VEX_NUM];
	int vexnum, arcnum;
	GraphType type;
} MGraph;

建立圖的鄰接矩陣的算法描述如下:

 

  (1) 輸入圖的類型(無向圖還是有向圖)

  (2) 輸入圖的頂點數,邊數

  (3) 輸入頂點的字符信息,建立頂點數組

  (4) 初始化鄰接矩陣

  (5) 輸入邊的信息,建立圖的鄰接矩陣,注意區分是圖的類型,另外,如果是有權圖,鄰接矩陣保存其邊的權重,這裡是無權圖。

 

算法源代碼如下:

 

void create_MG(MGraph *MG) {
	int i, j, k;
	int v1, v2, type;
	char c1, c2;
	printf(Please input graph type DG(0) or UDG(1) :);
	scanf(%d, &type);
	if (type == 0)
		MG->type = DG;
	else if (type == 1)
		MG->type = UDG;
	else {
		printf(Please input correct graph type DG(0) or UDG(1)!);
		return;
	}

	printf(Please input vexmun : );
	scanf(%d, &MG->vexnum);
	printf(Please input arcnum : );
	scanf(%d, &MG->arcnum);
	getchar();
	for (i = 1; i <= MG->vexnum; i++) {
		printf(Please input %dth vex(char):, i);
		scanf(%c, &MG->vexs[i]);
		getchar();
	}

	//初始化鄰接矩陣
	for (i = 1; i <= MG->vexnum; i++) {
		for (j = 1; j <= MG->vexnum; j++) {
			MG->arcs[i][j] = 0;
		}
	}

	//輸入邊的信息,建立鄰接矩陣
	for (k = 1; k <= MG->arcnum; k++) {
		printf(Please input %dth arc v1(char) v2(char) : , k);

		scanf(%c %c, &c1, &c2);
		v1 = getIndexOfVexs(c1, MG);
		v2 = getIndexOfVexs(c2, MG);
		if (MG->type上 == 1)
			MG->arcs[v1][v2] = MG->arcs[v2][v1] = 1;
		else
			MG->arcs[v1][v2] = 1;
		getchar();
	}
}
算法說明:

 

   該算法的時間復雜度為O(n^2+n*e),其中O(n^2)的時間耗費在鄰接矩陣的初始化操作上,O(n*e)的時間耗費在鄰接矩陣的建立操作上,因為在一般情況下,e<

 

完整代碼如下:

 

/*
 ============================================================================
 Name        : Graph.c
 Author      : jesson20121020
 Version     : 1.0
 Description : create Graph using Adjacency Matrix, Ansi-style
 ============================================================================
 */

#include 
#include 
#define MAX_VEX_NUM 50
typedef char VertexType;
typedef enum {
	DG, UDG
} GraphType;
typedef struct {
	VertexType vexs[MAX_VEX_NUM];
	int arcs[MAX_VEX_NUM][MAX_VEX_NUM];
	int vexnum, arcnum;
	GraphType type;
} MGraph;

/**
 * 根據名稱得到指定頂點在頂點集合中的下標
 * vex  頂點
 * return 如果找到,則返回下標,否則,返回0
 */
int getIndexOfVexs(char vex, MGraph *MG) {
	int i;
	for (i = 1; i <= MG->vexnum; i++) {
		if (MG->vexs[i] == vex) {
			return i;
		}
	}
	return 0;
}

/**
 * 創建鄰接矩陣
 */
void create_MG(MGraph *MG) {
	int i, j, k;
	int v1, v2, type;
	char c1, c2;
	printf(Please input graph type DG(0) or UDG(1) :);
	scanf(%d, &type);
	if (type == 0)
		MG->type = DG;
	else if (type == 1)
		MG->type = UDG;
	else {
		printf(Please input correct graph type DG(0) or UDG(1)!);
		return;
	}

	printf(Please input vexmun : );
	scanf(%d, &MG->vexnum);
	printf(Please input arcnum : );
	scanf(%d, &MG->arcnum);
	getchar();
	for (i = 1; i <= MG->vexnum; i++) {
		printf(Please input %dth vex(char):, i);
		scanf(%c, &MG->vexs[i]);
		getchar();
	}

	//初始化鄰接矩陣
	for (i = 1; i <= MG->vexnum; i++) {
		for (j = 1; j <= MG->vexnum; j++) {
			MG->arcs[i][j] = 0;
		}
	}

	//輸入邊的信息,建立鄰接矩陣
	for (k = 1; k <= MG->arcnum; k++) {
		printf(Please input %dth arc v1(char) v2(char) : , k);

		scanf(%c %c, &c1, &c2);
		v1 = getIndexOfVexs(c1, MG);
		v2 = getIndexOfVexs(c2, MG);
		if (MG->type == 1)
			MG->arcs[v1][v2] = MG->arcs[v2][v1] = 1;
		else
			MG->arcs[v1][v2] = 1;
		getchar();
	}
}
/**
 * 打印鄰接矩陣和頂點信息
 */
void print_MG(MGraph MG) {
	int i, j;
	if(MG.type == DG){
		printf(Graph type: Direct graph
);
	}
	else{
		printf(Graph type: Undirect graph
);
	}

	printf(Graph vertex number: %d
,MG.vexnum);
	printf(Graph arc number: %d
,MG.arcnum);

	printf(Vertex set:
 );
	for (i = 1; i <= MG.vexnum; i++)
		printf(%c	, MG.vexs[i]);
	printf(
Adjacency Matrix:
);

	for (i = 1; i <= MG.vexnum; i++) {
		j = 1;
		for (; j < MG.vexnum; j++) {
			printf(%d	, MG.arcs[i][j]);
		}
		printf(%d
, MG.arcs[i][j]);
	}
}

/**
 * 主函數
 */
int main(void) {
	MGraph MG;
	create_MG(&MG);
	print_MG(MG);
	return EXIT_SUCCESS;
}

執行結果:

 

 

Please input graph type UG(0) or UDG(1) :0
Please input vexmun : 4
Please input arcnum : 4
Please input 1th vex(char):a
Please input 2th vex(char):b
Please input 3th vex(char):c
Please input 4th vex(char):d
Please input 1th arc v1(char) v2(char) : a b
Please input 2th arc v1(char) v2(char) : a c
Please input 3th arc v1(char) v2(char) : a d
Please input 4th arc v1(char) v2(char) : b c
Graph type: Direct graph
Graph vertex number: 4
Graph arc number: 4
vertex set:
 a	b	c	d	
Adjacency Matrix:
0	1	1	1
0	0	1	0
0	0	0	0
0	0	0	0
   以上實現了圖的鄰接矩陣表示,其實,圖還有其他的存儲方式,如鄰接表,十字鏈表等

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved