采用邻接矩阵存储结构,构造有向带权图,并求各顶点的入度和出度。用c语言代码实现
时间: 2024-03-12 18:46:11 浏览: 83
好的,我可以给你提供一个用 C 语言实现的代码示例,来构造有向带权图并求各顶点的入度和出度。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
// 定义邻接矩阵存储有向带权图
typedef struct {
int V;
int graph[MAX_VERTICES][MAX_VERTICES];
} WeightedGraph;
WeightedGraph* create_graph(int vertices) {
WeightedGraph* graph = (WeightedGraph*) malloc(sizeof(WeightedGraph));
graph->V = vertices;
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
graph->graph[i][j] = 0;
}
}
return graph;
}
void add_edge(WeightedGraph* graph, int u, int v, int w) {
graph->graph[u][v] = w;
}
void print_graph(WeightedGraph* graph) {
for (int i = 0; i < graph->V; i++) {
for (int j = 0; j < graph->V; j++) {
printf("%4d ", graph->graph[i][j]);
}
printf("\n");
}
}
int get_indegree(WeightedGraph* graph, int v) {
int indegree = 0;
for (int i = 0; i < graph->V; i++) {
if (graph->graph[i][v] != 0) {
indegree++;
}
}
return indegree;
}
int get_outdegree(WeightedGraph* graph, int v) {
int outdegree = 0;
for (int j = 0; j < graph->V; j++) {
if (graph->graph[v][j] != 0) {
outdegree++;
}
}
return outdegree;
}
int main() {
// 构造一个有向带权图示例并计算各顶点的入度和出度
WeightedGraph* graph = create_graph(4);
add_edge(graph, 0, 1, 4);
add_edge(graph, 1, 2, 2);
add_edge(graph, 1, 3, 3);
add_edge(graph, 2, 3, 5);
print_graph(graph);
printf("节点 0:入度 %d,出度 %d\n", get_indegree(graph, 0), get_outdegree(graph, 0));
printf("节点 1:入度 %d,出度 %d\n", get_indegree(graph, 1), get_outdegree(graph, 1));
printf("节点 2:入度 %d,出度 %d\n", get_indegree(graph, 2), get_outdegree(graph, 2));
printf("节点 3:入度 %d,出度 %d\n", get_indegree(graph, 3), get_outdegree(graph, 3));
free(graph);
return 0;
}
```
在这个示例代码中,我们首先定义了一个 `WeightedGraph` 结构体来表示有向带权图,其中包含了图的节点数 `V` 和邻接矩阵 `graph`。然后,我们定义了 `create_graph` 函数来创建一个有向带权图,并用 `add_edge` 函数向图中添加有向边。接下来,我们定义了 `print_graph` 函数来打印邻接矩阵。
然后,我们定义了 `get_indegree` 和 `get_outdegree` 函数来计算图中每个节点的入度和出度。这两个函数的实现方式与前面所述的计算方法是一致的。
最后,我们构造了一个有向带权图示例,并计算了各顶点的入度和出度。你可以根据这个示例代码来更好地理解有向带权图的存储和计算方式。
阅读全文