算法设计求有向图中每个顶点的入度和出度
时间: 2024-03-16 22:42:24 浏览: 78
好的,根据您的要求,我来为您编写这个算法。
假设有向图的邻接表存储结构如下:
```
typedef struct ArcNode {
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
int indegree; // 顶点的入度
int outdegree; // 顶点的出度
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 存储各个顶点的邻接表
int vexnum, arcnum; // 图的顶点数和弧数
} ALGraph;
```
1. 求每个顶点的入度
对于有向图中的每个顶点,可以遍历整个邻接表,统计指向该顶点的弧的条数,即为该顶点的入度。具体算法如下:
```
void indegree(ALGraph *G) {
// 初始化每个顶点的入度为0
for (int i = 0; i < G->vexnum; i++) {
G->vertices[i].indegree = 0;
}
// 遍历整个邻接表,统计每个顶点的入度
for (int i = 0; i < G->vexnum; i++) {
ArcNode *p = G->vertices[i].firstarc;
while (p != NULL) {
G->vertices[p->adjvex].indegree++;
p = p->nextarc;
}
}
}
```
2. 求每个顶点的出度
对于有向图中的每个顶点,可以遍历该顶点的邻接表,统计该顶点指向其他顶点的弧的条数,即为该顶点的出度。具体算法如下:
```
void outdegree(ALGraph *G) {
// 初始化每个顶点的出度为0
for (int i = 0; i < G->vexnum; i++) {
G->vertices[i].outdegree = 0;
}
// 遍历每个顶点的邻接表,统计每个顶点的出度
for (int i = 0; i < G->vexnum; i++) {
ArcNode *p = G->vertices[i].firstarc;
while (p != NULL) {
G->vertices[i].outdegree++;
p = p->nextarc;
}
}
}
```
希望能够帮助到您!
阅读全文