数据结构 图 邻接矩阵表示图

邻接矩阵表示图的数据类型遍历

#define MAX_VERTEX 100			//最大顶点数
#define MAX_WEIGHT 99999		//最大权值

typedef char VerType;			//顶点类型
typedef int EdgeType;			//边类型

struct AMGraph					//Adjacency Matrix Graph--邻接矩阵表示图
{
	VerType vers[MAX_VERTEX];		//顶点表
	EdgeType edges[MAX_VERTEX][MAX_VERTEX];		//邻接矩阵
	int vernum, edgenum;			//图的当前顶点数和边数
};

由顶点值查找顶点下标

int LocateVer(const AMGraph& G, VerType u) {		//由顶点值查找顶点下标
	for (int i = 0; i < G.vernum; ++i) {
		if (G.vers[i] == u)
			return i;
	}
	return -1;

}

创建无向有权图

int Create_unAMGraph_weight(AMGraph& G) {		//创建无向有权图
	cout << "请输入图的顶点数和边数:" << endl;
	cin >> G.vernum >> G.edgenum;
	for (int i = 0; i < G.vernum; ++i) {
		cout << "请输入顶点的信息:" << endl;
		cin >> G.vers[i];
	}
	for (int i = 0; i < G.vernum; ++i) {
		for (int j = 0; j < G.vernum; ++j) {
			G.edges[i][j] = MAX_WEIGHT;			//边的权值初始化为最大值
		}
	}
	VerType v1, v2;
	int i, j;
	int weight;
	for (int k = 0; k < G.edgenum; ++k) {
		cout << "请输入要添加边的顶点信息和权值:" << endl;
		cin >> v1 >> v2 >> weight;
		i = LocateVer(G, v1);
		j = LocateVer(G, v2);
		G.edges[i][j] = G.edges[j][i] = weight;
	}
	return OK;
}

创建有向无权图

int Create_AMGraph_weight(AMGraph& G) {					//创建有向无权图
	cout << "输入图的顶点数和边数" << endl;
	cin >> G.vernum >> G.edgenum;
	for (int i = 0; i < G.vernum; ++i) {
		cout << "请输入顶点的信息:" << endl;
		cin >> G.vers[i];
	}
	for (int i = 0; i < G.vernum; ++i) {
		for (int j = 0; j < G.vernum; ++j) {
			G.edges[i][j] = 0;
		}
	}
	int i, j;
	VerType v1, v2;
	for (int k = 0; k < G.edgenum; ++k) {
		cout << "输入添加边所依赖的两个顶点(前指向后):" << endl;
		cin >> v1 >> v2;
		i = LocateVer(G, v1);
		j = LocateVer(G, v2);
		G.edges[i][j] = 1;			//有向图不是对称矩阵

	}
	return OK;

}

展示邻接矩阵

void showGraph(const AMGraph& G) {				//展示邻接矩阵
	for (int i = 0; i < G.vernum; ++i) {
		for (int j = 0; j < G.vernum; ++j) {
			cout << G.edges[i][j] << "  ";
		}
		cout << endl;
	}
}

测试代码

int main() {
	AMGraph G;
	Create_unAMGraph_weight(G);
	showGraph(G);
	Create_AMGraph_weight(G);
	showGraph(G);

	system("pause");
	return 0;

}

无向有权图
在这里插入图片描述
有向无权图
在这里插入图片描述
全部代码

#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_VERTEX 100			//最大顶点数
#define MAX_WEIGHT 99999		//最大权值

typedef char VerType;			//顶点类型
typedef int EdgeType;			//边类型

struct AMGraph					//Adjacency Matrix Graph--邻接矩阵表示图
{
	VerType vers[MAX_VERTEX];		//顶点表
	EdgeType edges[MAX_VERTEX][MAX_VERTEX];		//邻接矩阵
	int vernum, edgenum;			//图的当前顶点数和边数
};

int LocateVer(const AMGraph& G, VerType u) {		//由顶点值查找顶点下标
	for (int i = 0; i < G.vernum; ++i) {
		if (G.vers[i] == u)
			return i;
	}
	return -1;

}

int Create_unAMGraph_weight(AMGraph& G) {		//创建无向有权图
	cout << "请输入图的顶点数和边数:" << endl;
	cin >> G.vernum >> G.edgenum;
	for (int i = 0; i < G.vernum; ++i) {
		cout << "请输入顶点的信息:" << endl;
		cin >> G.vers[i];
	}
	for (int i = 0; i < G.vernum; ++i) {
		for (int j = 0; j < G.vernum; ++j) {
			G.edges[i][j] = MAX_WEIGHT;			//边的权值初始化为最大值
		}
	}
	VerType v1, v2;
	int i, j;
	int weight;
	for (int k = 0; k < G.edgenum; ++k) {
		cout << "请输入要添加边的顶点信息和权值:" << endl;
		cin >> v1 >> v2 >> weight;
		i = LocateVer(G, v1);
		j = LocateVer(G, v2);
		G.edges[i][j] = G.edges[j][i] = weight;
	}
	return OK;
}

int Create_AMGraph_weight(AMGraph& G) {					//创建有向无权图
	cout << "输入图的顶点数和边数" << endl;
	cin >> G.vernum >> G.edgenum;
	for (int i = 0; i < G.vernum; ++i) {
		cout << "请输入顶点的信息:" << endl;
		cin >> G.vers[i];
	}
	for (int i = 0; i < G.vernum; ++i) {
		for (int j = 0; j < G.vernum; ++j) {
			G.edges[i][j] = 0;
		}
	}
	int i, j;
	VerType v1, v2;
	for (int k = 0; k < G.edgenum; ++k) {
		cout << "输入添加边所依赖的两个顶点(前指向后):" << endl;
		cin >> v1 >> v2;
		i = LocateVer(G, v1);
		j = LocateVer(G, v2);
		G.edges[i][j] = 1;			//有向图不是对称矩阵

	}
	return OK;

}



void showGraph(const AMGraph& G) {				//展示邻接矩阵
	for (int i = 0; i < G.vernum; ++i) {
		for (int j = 0; j < G.vernum; ++j) {
			cout << G.edges[i][j] << "  ";
		}
		cout << endl;
	}
}


int main() {
	AMGraph G;
	Create_unAMGraph_weight(G);
	showGraph(G);
	Create_AMGraph_weight(G);
	showGraph(G);

	system("pause");
	return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值