【算法设计题】计算有向图G中每个结点的入度和出度,第4题(C/C++)

目录

第4题 计算有向图G中每个结点的入度和出度

 得分点(必背)

题解:计算有向图G中每个结点的入度和出度

数据结构定义

边表结点

顶点表结点

图的邻接表存储表示

计算图G中每个结点的入度和出度

详细解释

1. 初始化入度和出度数组

2. 遍历每个顶点的邻接表

3. 输出每个结点的入度和出度

示例


🌈 嗨,我是命运之光

🌌 2024,每日百字,记录时光,感谢有你,携手前行~

🚀 携手启航,我们一同深入未知的领域,挖掘潜能,让每一步成长都充满意义。


第4题 计算有向图G中每个结点的入度和出度

已知有向图G的邻接表存储方式,计算图G中每个结点入度和出度

 得分点(必背)

//题解如下:
//边表结点
typedef struct ArcNode {
    int adjvex; // 邻接点域,存储该边所指向的顶点的位置
    struct ArcNode *nextarc; // 下一个邻接表结点指针域,用于连接其他边表结点
} ArcNode;

// 顶点表结点
typedef struct VexNode {
    int data; // 顶点信息域,存储顶点的信息
    ArcNode *first; // 指向该顶点所对应的边表结点指针域,用于连接其他顶点
}VNode, AdjList[MAXVEX];

//图的邻接表存储表示
typedef struct {
    VexNode adjlist; // 邻接表,存储顶点信息
    int vexnum,arcnum; // 顶点数  // 边数
} AGraph;

//计算图G中每一个结点的入度和出度
void count_du(AGraph G){
    int in[G.vexnum], out[G.vexnum];

    // 初始化入度和出度数组
    for(int i = 0; i < G.vexnum; ++i){
        in[i] = 0; 
        out[i] = 0;
    }

    //遍历每个顶点的邻接表
    for(int i = 0; i < G.vexnum; ++i){
        ArcNode *P = G.adjlist[i].first;//这块没问题
        while(P){
            out[i]++;
            in[P->adjvex]++;
            P = P->nextarc;
        }
    }
    //输出每个结点的入度和出度
    for(int i = 0; i < G.vexnum; ++i){
        cout << "顶点" << i << "的入度为:" << in[i] << ", 出度为:" << out[i] << endl;
    }
}

题解:计算有向图G中每个结点的入度和出度

在这个题目中,我们需要计算有向图G中每个结点的入度和出度。有向图的邻接表存储方式由顶点表和边表构成,顶点表存储顶点信息,边表存储边的指向关系。

数据结构定义
边表结点
typedef struct ArcNode {
    int adjvex; // 邻接点域,存储该边所指向的顶点的位置
    struct ArcNode *nextarc; // 下一个邻接表结点指针域,用于连接其他边表结点
} ArcNode;
  • adjvex:该边所指向的顶点的位置。
  • nextarc:指向下一个边表结点的指针,用于连接同一顶点的其他边。
顶点表结点
typedef struct VexNode {
    int data; // 顶点信息域,存储顶点的信息
    ArcNode *first; // 指向该顶点所对应的边表结点指针域,用于连接其他顶点
} VNode, AdjList[MAXVEX];
  • data:存储顶点的信息。
  • first:指向该顶点的第一个边表结点。
图的邻接表存储表示
typedef struct {
    VexNode adjlist[MAXVEX]; // 邻接表,存储顶点信息
    int vexnum, arcnum; // 顶点数和边数
} AGraph;
  • adjlist:邻接表,存储所有顶点的信息。
  • vexnum:顶点数。
  • arcnum:边数。
计算图G中每个结点的入度和出度
void count_du(AGraph G){
    int in[G.vexnum], out[G.vexnum];

    // 初始化入度和出度数组
    for(int i = 0; i < G.vexnum; ++i){
        in[i] = 0; 
        out[i] = 0;
    }

    // 遍历每个顶点的邻接表
    for(int i = 0; i < G.vexnum; ++i){
        ArcNode *P = G.adjlist[i].first;
        while(P){
            out[i]++; // 当前顶点的出度加1
            in[P->adjvex]++; // P所指向的顶点的入度加1
            P = P->nextarc; // 移动到下一个边表结点
        }
    }

    // 输出每个结点的入度和出度
    for(int i = 0; i < G.vexnum; ++i){
        cout << "顶点" << i << "的入度为:" << in[i] << ", 出度为:" << out[i] << endl;
    }
}
详细解释
1. 初始化入度和出度数组
int in[G.vexnum], out[G.vexnum];

for(int i = 0; i < G.vexnum; ++i){
    in[i] = 0; 
    out[i] = 0;
}
  • 创建两个数组 inout 分别用于存储每个顶点的入度和出度。
  • 使用循环将这两个数组初始化为0。
2. 遍历每个顶点的邻接表
for(int i = 0; i < G.vexnum; ++i){
    ArcNode *P = G.adjlist[i].first;
    while(P){
        out[i]++; // 当前顶点的出度加1
        in[P->adjvex]++; // P所指向的顶点的入度加1
        P = P->nextarc; // 移动到下一个边表结点
    }
}
  • 使用循环遍历图中每个顶点。
  • 对于每个顶点,获取其边表的第一个结点。
  • 遍历边表的每个结点,统计出度和入度:
    • 当前顶点的出度加1。
    • 该结点所指向的顶点的入度加1。
    • 移动到下一个边表结点。
3. 输出每个结点的入度和出度
for(int i = 0; i < G.vexnum; ++i){
    cout << "顶点" << i << "的入度为:" << in[i] << ", 出度为:" << out[i] << endl;
}
  • 再次使用循环,遍历每个顶点。
  • 输出每个顶点的入度和出度。
示例

假设有如下图G:

顶点0 -> 顶点1 -> 顶点2
顶点1 -> 顶点2 -> 顶点3
顶点2 -> 顶点3
  • 顶点0的出度为1,入度为0。
  • 顶点1的出度为2,入度为1。
  • 顶点2的出度为1,入度为2。
  • 顶点3的出度为0,入度为2。

运行上述代码,输出如下:

顶点0的入度为:0, 出度为:1
顶点1的入度为:1, 出度为:2
顶点2的入度为:2, 出度为:1
顶点3的入度为:2, 出度为:0

嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,根据您的要求,我来为您编写这个算法。 假设有向图的邻接表存储结构如下: ``` 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; } } } ``` 希望能够帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值