首页 > 其他分享 >图的邻接矩阵

图的邻接矩阵

时间:2023-06-06 14:32:58浏览次数:41  
标签:vexnum MGraph int void 邻接矩阵 v0 ++

#include <stdio.h>
#include <stdlib.h>
#define N 20
#define TRUE 1
#define FALSE 0
//访问标志数组
int visited[N];

//采用数组定义的队列,用于广度搜索
typedef struct {
	int data[N];
	int front, rear;
} SqQueue;

//图的邻接矩阵表示
typedef struct {
	int vexnum, arcnum;
	char vexs[N];
	int arcs[N][N];
} MGraph;

void createGraph(MGraph *g);
void dfs(int i, MGraph *g);
void tdfs(MGraph *g, int v0);
void bfs(int k, MGraph *g);
void tbfs(MGraph *g, int v0);
void init_visit();

//读入数据,创建无向图的邻接矩阵
void createGraph(MGraph *g) {
	char s;
	int i = 0, v1, v2;
	g->arcnum = 0;
	g->vexnum = 0;
	s = getchar();
	while (s != '#') {
		g->vexs[i] = s;
		g->vexnum++;
		s = getchar();
		i++;
	}
	getchar();
	for (int a = 0; a < i; a++)
		for (int b = 0; b < i; b++)
			g->arcs[a][b] = 0;
	scanf("%d,%d", &v1, &v2);
	while (v1 != -1 && v2 != -1) {
		g->arcs[v1][v2] = 1;
		g->arcs[v2][v1] = 1;
		scanf("%d,%d", &v1, &v2);
		g->arcnum++;
	}
}

//深度优先搜索-从顶点i出发深度搜索
void dfs(int i, MGraph *g) {
	int j;
	printf("%c", g->vexs[i]);
	visited[i] = 1;
	for (j = 0; j < g->vexnum; j++) {
		if (g->arcs[i][j] == 1 && !visited[j])
			dfs(j, g);
	}
}

//深度优先搜索-全图搜索
void tdfs(MGraph *g, int v0) {
	int i;
	for (i = 0; i < g->vexnum; i++)
		if (visited[i] != TRUE)
			dfs(v0, g);


}

//广度优先搜索-从顶点k广度搜索
void bfs(int k, MGraph *g) {
	int i, j;
	SqQueue qlist, *q;
	q = &qlist;
	q->rear = 0;
	q->front = 0;
	printf("%c", g->vexs[k]);
	visited[k] = TRUE;
	q->data[q->rear] = k;
	q->rear = (q->rear + 1) % N;
	while (q->rear != q->front) {
		i = q->data[q->front];
		q->front = (q->front + 1) % N;
		for (j = 0; j < g->vexnum; j++)
			if ((g->arcs[i][j] == 1) && (!visited[j])) {
				printf("%c", g->vexs[j]);
				visited[j] = TRUE;
				q->data[q->rear] = j;
				q->rear = (q->rear + 1) % N;
			}
	}


}

//广度优先搜素-全图搜索
void tbfs(MGraph *g, int v0) {
	int i;
	for (i = 0; i < g->vexnum; i++)
		if (visited[i] != TRUE)
			bfs(v0, g);







}

//初始化访问标志数组
void init_visit() {
	int i;
	for (i = 0; i < N; i++)
		visited[i] = FALSE;
}

int main() {
	MGraph g;
	int i, j, v0;
	createGraph(&g);
	scanf("%d", &v0);
	printf("graph:\n");
	for (i = 0; i < g.vexnum; i++) {
		for (j = 0; j < g.vexnum; j++)
			printf("%d ", g.arcs[i][j]);
		printf("\n");
	}
	printf("dfs:");
	init_visit();
	tdfs(&g, v0);
	printf("bfs:");
	init_visit();
	tbfs(&g, v0);

	return 0;
}


标签:vexnum,MGraph,int,void,邻接矩阵,v0,++
From: https://blog.51cto.com/u_16030624/6424376

相关文章

  • 描述图的两种数据结构 - 邻接表和邻接矩阵
    图的邻接表和邻接矩阵是两种常用的表示图的数据结构,用于描述图中各个顶点之间的连接关系。图是由一组顶点和一组边组成的数据结构,顶点表示图中的对象,边表示对象之间的关系。邻接表和邻接矩阵都可以有效地表示图的结构,并提供了不同的优势和适用场景。邻接表:邻接表是一种链表的......
  • 邻接矩阵的算法设计
    题目描述假设图G采用邻接矩阵存储,分别设计实现以下要求的算法:1.输出每个顶点的入度2.输出每个顶点的出度3.求出度最大的一个顶点,输出其编号4.计算图中出度为0的顶点数5.判断图中是否有边<i,j> 解决思路1.入度是邻接矩阵中第i列的元素之和在函数InDegree()中,我们需要设置一个循环......
  • 将邻接矩阵转化为邻接表
    解决方法邻接表是一种图的表示方式,可以通过链表来表示每个顶点的邻接点集合。将邻接矩阵转化为邻接表,可以先创建一个顶点数组,然后对于每个顶点,将其对应的行或列中非零元素的列或行号(表示相邻的其他顶点)存储到该顶点的链表中。代码实现#include<stdio.h>#include<stdlib.h>#de......
  • 读取txt文件创建邻接矩阵
    txt文本内容如下,要求使用这些数据来生成一个邻接矩阵0,2,4,22,65536,655362,0,1,6,65536,655364,1,0,1,4,6553622,6,1,0,10,565536,65536,4,10,0,365536,65536,6553......
  • 邻接矩阵、稀疏矩阵(torch, sparse, numpy)相互转换 [转载]
    原链接:邻接矩阵转稀疏矩阵邻接矩阵转稀疏矩阵Example:importscipy.sparseasspimportnumpyasnpimporttorchadj_matrix=torch.randint(0,2,(4,4))print(ad......
  • [算法]图(邻接矩阵)的深度遍历
    packagecom.FeeLang;importjava.util.Scanner;classArcNode{intadjvex;ArcNodenext;}classVertexNode{charvertex;ArcNodefirstedge;}publicclassGraph......
  • 邻接矩阵和邻接表存储的时间复杂度
    用邻接矩阵构造图时,若存储的是一个无向图,则时间复杂度为O(n^2+n*e),其中,对邻接矩阵的初始化耗费的时间为O(n^2);对于DFS,BFS遍历来说,时间复杂度和存储结构有关:n表示有n......
  • 4_1邻接矩阵图
    1.图的邻接矩阵结构体定义#include<stdio.h>#defineMaxvertices20typedefstructSeqlist{ intlength;//存储顶点总数 char*data;//等价于chardata[M......
  • C语言 图的遍历(广度优先和深度优先、邻接矩阵)
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>/*--------辅助广度优先遍历用的空闲单元法循环队列-----------*/#defineMaxQueuenNum20typ......
  • 图的存储之邻接矩阵
    邻接矩阵存图:c++1#include<iostream>2usingnamespacestd;34classAM//邻接矩阵存图用法AM图的名称={规模长(int),规模宽(int),是否为无向图,是为true,......