用c语言实现邻接矩阵创建一个带权有向图并实现计算各顶点的入度,深度优先遍历,广度优先遍历
时间: 2024-02-23 14:59:43 浏览: 92
好的,下面是基于邻接矩阵的带权有向图的实现和相关操作的代码(使用 C 语言实现):
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h> // 定义一个无穷大的数
#define MAX_SIZE 100 // 最大顶点数
#define INF INT_MAX // 定义一个无穷大的数
typedef struct {
int vertex_num; // 顶点数
int edge_num; // 边数
int matrix[MAX_SIZE][MAX_SIZE]; // 邻接矩阵
} Graph;
// 创建一个新的图
Graph* createGraph(int n, int m) {
Graph* graph = (Graph*)malloc(sizeof(Graph));
graph->vertex_num = n;
graph->edge_num = m;
// 初始化邻接矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
graph->matrix[i][j] = INF;
}
}
return graph;
}
// 添加一条从 u 到 v 的边,权值为 w
void addEdge(Graph* graph, int u, int v, int w) {
graph->matrix[u][v] = w;
}
// 计算各个顶点的入度
void calcInDegree(Graph* graph) {
int in_degree[MAX_SIZE] = {0};
for (int j = 1; j <= graph->vertex_num; j++) {
for (int i = 1; i <= graph->vertex_num; i++) {
if (graph->matrix[i][j] != INF) {
in_degree[j]++;
}
}
}
for (int i = 1; i <= graph->vertex_num; i++) {
printf("顶点 %d 的入度为 %d\n", i, in_degree[i]);
}
}
// 深度优先遍历
void dfs(Graph* graph, int u, bool visited[]) {
visited[u] = true;
printf("%d ", u);
for (int v = 1; v <= graph->vertex_num; v++) {
if (graph->matrix[u][v] != INF && !visited[v]) {
dfs(graph, v, visited);
}
}
}
// 从顶点 s 开始进行深度优先遍历
void dfsTraversal(Graph* graph, int s) {
bool visited[MAX_SIZE] = {false};
dfs(graph, s, visited);
printf("\n");
}
// 广度优先遍历
void bfsTraversal(Graph* graph, int s) {
bool visited[MAX_SIZE] = {false};
int queue[MAX_SIZE];
int front = 0, rear = 0;
queue[rear++] = s;
visited[s] = true;
while (front < rear) {
int u = queue[front++];
printf("%d ", u);
for (int v = 1; v <= graph->vertex_num; v++) {
if (graph->matrix[u][v] != INF && !visited[v]) {
queue[rear++] = v;
visited[v] = true;
}
}
}
printf("\n");
}
int main() {
int n, m;
printf("请输入顶点数和边数:");
scanf("%d%d", &n, &m);
Graph* graph = createGraph(n, m);
printf("请依次输入边的起点、终点和权值:\n");
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(graph, u, v, w);
}
printf("各个顶点的入度为:\n");
calcInDegree(graph);
printf("深度优先遍历结果为:");
dfsTraversal(graph, 1);
printf("广度优先遍历结果为:");
bfsTraversal(graph, 1);
return 0;
}
```
示例输入:
```
请输入顶点数和边数:5 6
请依次输入边的起点、终点和权值:
1 2 1
1 3 2
2 4 3
2 5 4
3 5 5
4 5 6
```
示例输出:
```
各个顶点的入度为:
顶点 1 的入度为 0
顶点 2 的入度为 1
顶点 3 的入度为 1
顶点 4 的入度为 1
顶点 5 的入度为 3
深度优先遍历结果为:1 2 4 5 3
广度优先遍历结果为:1 2 3 4 5
```
阅读全文
相关推荐















