算法1:输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历结果 用c语言 加上主函数
时间: 2023-12-10 15:03:11 浏览: 98
toolkirvevf,graph 源码 顶点 边 matlab 有向图,matlab源码之家
以下是算法1的C语言代码实现,包括建立图、深度优先搜索和广度优先搜索遍历图以及输出结果的功能。具体注释见代码中。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 图的类型
typedef enum {
DG, // 有向图
DN, // 有向网
UG, // 无向图
UN // 无向网
} GraphType;
// 边/弧的类型
typedef struct {
int weight; // 权值
} ArcType;
// 图的结构体
typedef struct {
GraphType type; // 图的类型
int vertexNum; // 顶点数
int arcNum; // 边/弧数
char vertex[MAX_VERTEX_NUM]; // 顶点信息
ArcType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 边/弧信息
} Graph;
// 初始化图
void initGraph(Graph* G, GraphType type, int vertexNum, int arcNum, char* vertex, ArcType* arcs) {
G->type = type;
G->vertexNum = vertexNum;
G->arcNum = arcNum;
for (int i = 0; i < vertexNum; i++) {
G->vertex[i] = vertex[i];
for (int j = 0; j < vertexNum; j++) {
if (i == j) {
G->arcs[i][j].weight = 0;
} else {
G->arcs[i][j].weight = INT_MAX; // 初始值为无穷大
}
}
}
for (int i = 0; i < arcNum; i++) {
int from, to;
ArcType arc;
printf("请输入边/弧信息(起点 终点 权值): ");
scanf("%d %d %d", &from, &to, &arc.weight);
G->arcs[from][to] = arc;
if (type == UG || type == UN) {
G->arcs[to][from] = arc; // 如果是无向图/网,还要加上反向边/弧
}
}
}
// 深度优先搜索遍历图
void DFS(Graph* G, bool* visited, int v) {
visited[v] = true;
printf("%c ", G->vertex[v]);
for (int i = 0; i < G->vertexNum; i++) {
if (G->arcs[v][i].weight != INT_MAX && !visited[i]) { // i是v的邻接点且未被访问
DFS(G, visited, i);
}
}
}
// 深度优先搜索
void depthFirstSearch(Graph* G) {
bool visited[MAX_VERTEX_NUM] = {false}; // 记录每个顶点是否被访问
printf("深度优先搜索结果: ");
for (int i = 0; i < G->vertexNum; i++) {
if (!visited[i]) { // 从未被访问的顶点开始进行深度优先搜索
DFS(G, visited, i);
}
}
printf("\n");
}
// 广度优先搜索遍历图
void BFS(Graph* G, bool* visited, int v) {
int queue[MAX_VERTEX_NUM]; // 存放待访问的顶点的队列
int front = 0, rear = 0; // 队列的头和尾
visited[v] = true;
printf("%c ", G->vertex[v]);
queue[rear++] = v;
while (front != rear) { // 队列非空
int w = queue[front++];
for (int i = 0; i < G->vertexNum; i++) {
if (G->arcs[w][i].weight != INT_MAX && !visited[i]) { // i是w的邻接点且未被访问
visited[i] = true;
printf("%c ", G->vertex[i]);
queue[rear++] = i;
}
}
}
}
// 广度优先搜索
void breadthFirstSearch(Graph* G) {
bool visited[MAX_VERTEX_NUM] = {false}; // 记录每个顶点是否被访问
printf("广度优先搜索结果: ");
for (int i = 0; i < G->vertexNum; i++) {
if (!visited[i]) { // 从未被访问的顶点开始进行广度优先搜索
BFS(G, visited, i);
}
}
printf("\n");
}
// 输出图
void printGraph(Graph* G) {
printf("图的类型: ");
switch (G->type) {
case DG:
printf("有向图\n");
break;
case DN:
printf("有向网\n");
break;
case UG:
printf("无向图\n");
break;
case UN:
printf("无向网\n");
break;
}
printf("顶点数: %d\n", G->vertexNum);
printf("边/弧数: %d\n", G->arcNum);
printf("顶点信息: ");
for (int i = 0; i < G->vertexNum; i++) {
printf("%c ", G->vertex[i]);
}
printf("\n边/弧信息:\n");
for (int i = 0; i < G->vertexNum; i++) {
for (int j = 0; j < G->vertexNum; j++) {
if (G->arcs[i][j].weight != INT_MAX) {
printf("(%d, %d, %d) ", i, j, G->arcs[i][j].weight);
}
}
printf("\n");
}
}
int main() {
Graph G;
GraphType type;
int vertexNum, arcNum;
char vertex[MAX_VERTEX_NUM];
ArcType arcs[MAX_VERTEX_NUM];
printf("请输入图的类型(0--有向图 1--有向网 2--无向图 3--无向网): ");
scanf("%d", &type);
printf("请输入顶点数和边/弧数: ");
scanf("%d %d", &vertexNum, &arcNum);
printf("请输入顶点信息: ");
for (int i = 0; i < vertexNum; i++) {
scanf(" %c", &vertex[i]);
}
initGraph(&G, type, vertexNum, arcNum, vertex, arcs);
printGraph(&G);
depthFirstSearch(&G);
breadthFirstSearch(&G);
return 0;
}
```
注意:这里采用了邻接矩阵存储结构,对于无向图/网,边/弧信息需要同时保存在两个顶点的邻接矩阵中。
阅读全文