矩阵法存储有向带权图

本文介绍了如何利用矩阵来存储和操作有向带权图,包括邻接矩阵的概念,以及如何通过矩阵进行路径查找和权重计算。讨论了矩阵在处理图数据结构时的优缺点,并给出了实际应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
     一般用矩阵法做带权图
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>   //用字符串去表示结点,方便去比较
#define   _CRT_SECURE_NO_WARNINGS


typedef  char  VertexType[4];         //顶点类型
typedef  int     VRType;              //权值类型
#define   MAX   10                    //定义最大的顶点数

typedef  struct   graph
{
	int   arcnum;   					   //arcnum是边数
	int   vexnum;   					   //顶点数
	VertexType  vextex[MAX];     //vetex是二维数组,存放的是字符串,而不是字符,方便去比较,这里其实是vetex[MAX][4]
	VRType   matrix[MAX][MAX];   //matrix是所有存在的边的权值情况
}GRAPH, *LPGRAPH;

//定位
int  searchPos(LPGRAPH  G, VertexType   x)
{
	for (int i = 0; i<G->vexnum; i++)
	{
		if (strcmp(G->vextex[i], x) == 0)  //vetex是二维数组
			return  i;
	}
	return  -1;
}

//创建图
LPGRAPH   createGraph()
{
	LPGRAPH  G = (LPGRAPH)malloc(sizeof(GRAPH));
	printf("请输入边数和顶点数:");
	scanf("%d%d", &G->arcnum, &G->vexnum);   //arcnum是边数,vexnum为顶点数
	printf("请输入%d个顶点:\n", G->vexnum);  //vexnum为顶点数
	for (int i = 0; i < G->vexnum; i++)      //vexnum为顶点数
	{
		//每一行都是字符串
		scanf("%s", G->vextex[i]);           //vetex是二维数组
	}
	//初始化权值数组
	//二维数组是MAX*MAX的大小
	memset(G->matrix, 0, sizeof(int)* 100);       //matrix是所有存在的边的权值情况
	//两点确定一条边
	printf("请输入%d 条边的信息:\n",G->arcnum);  //arcnum是边数
	VertexType  v1, v2;   //两个权值
	VRType  vrt;          //一条边
	for (int i = 0; i<G->arcnum; i++)   //arcnum是边数
	{
		scanf("%s%s%d", v1, v2, &vrt);
		//在权值数组中定位,确定行和列
		int   posV1 = searchPos(G, v1);
		int   posV2 = searchPos(G, v2);
		G->matrix[posV1][posV2] = vrt;  //matrix是所有存在的边的权值情况
	}
	return  G;
}

void  printGraph(LPGRAPH  G)
{
	//A   B   C   D
	for (int i = 0; i < G->vexnum; i++)  //vexnum为顶点数
	{
		printf("\t%s", G->vextex[i]);    //vetex是二维数组
	}
	printf("\n");
	for (int i = 0; i < G->vexnum; i++)   //vexnum为顶点数
	{
		//每一行起始位置打印顶点
		printf("%s\t", G->vextex[i]);     //vetex是二维数组
		for (int j = 0; j<G->vexnum; j++)  //vexnum为顶点数
		{
			printf("%d\t", G->matrix[i][j]);  //matrix是所有存在的边的权值情况
		}
		printf("\n");
	}
}

int    main()
{
	LPGRAPH  G = createGraph();
	printGraph(G);

	system("pause");
	return  0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值