度(入度、出度)求解、边数求解

/**
 * 总:度(入度、出度)求解、边数求解
 * 1、已知邻接矩阵求解每个顶点的度(入度和出度)
 *   ①有向图 ②无向图
 * 2、已知邻接矩阵求解边数
 *   ①有向图 ②无向图
 * 3、已知邻接表求解每个顶点的度(入度和出度)
 *   ①有向图 ②无向图
 *
 *
 * ①算法思想
 *
 * ②算法设计
 */

#include <stdio.h>
#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <cstdlib>
#define MaxSize 20
#define INF 999999


//1、已知连接矩阵求解每个顶点的度(入度和出度)
struct MGraph{
    char Vex[MaxSize];
    int Edge[MaxSize][MaxSize];
    int VexNum,ArcNum;
};
//①已知有向图的邻接矩阵
//求入度
int GetInDegreeX(MGraph G,int v){//v是告诉我们要求的那个顶点的下标
    //计算v这个点对应的列中有多少非0的值
    int degree = 0;
    for (int i = 0; i < G.VexNum; ++i) {
        if(G.Edge[i][v] != 0){//列固定不变,一行一行遍历判断
            degree ++;
        }
    }
    return degree;
}
//求出度
int GetOutDegreeX(MGraph G,int v){
    int degree = 0;
    for (int i = 0; i < G.VexNum; ++i) {
        if(G.Edge[v][i] != 0){
            degree ++;
        }
    }
    return degree;
}
//②已知无向图的邻接矩阵
//求度
int GetDegree(MGraph G,int v){//v是告诉我们要求的是哪个点
    //计算v这个点对应的列中有多少非0的值
    int degree = 0;
    for (int i = 0; i < G.VexNum; ++i) {
        if(G.Edge[i][v] != 0){//列固定不变,一行一行遍历判断
            //或者是if(G.Edge[v][i] != 0)
            degree ++;
        }
    }
    return degree;
}

//2、已知邻接矩阵求边数
//①已知有向图的邻接矩阵
int GetEdgeX(MGraph G){
    int EdgeNum = 0;
    for (int i = 0; i < G.VexNum; ++i) {
        for (int j = 0; j < G.VexNum; ++j) {
            if(G.Edge[i][j] != 0)
                EdgeNum ++;
        }
    }
    return EdgeNum;
}
//②已知无向图的邻接矩阵
int GetEdge(MGraph G){
    int EdgeNum = 0;
    for (int i = 0; i < G.VexNum; ++i) {
        for (int j = 0; j < G.VexNum; ++j) {
            if(G.Edge[i][j] != 0)
                EdgeNum ++;
        }
    }
    return EdgeNum / 2;
}

//3、已知邻接表求解每个顶点的度(入度和出度)
//边链表
struct ArcNode{
    int adjvex;//边链表中的顶点在数组中的下标
    struct ArcNode *next;//边链表的指针
    int weight;//可能会有权值(带权图才用)
};
//每个节点
struct VNode{
    char value;
    struct ArcNode *first;//指向边链表第一个节点的指针
};
//整个图的结构
struct AdGraph{
    VNode vertices[MaxSize];//VNode类型的数组
    int vexnum,arcnum;
};
//①已知有向图的邻接表
//求入度
int GetInDegreeX(AdGraph G,int v){
    int degree = 0;
    ArcNode *p;
    for (int i = 0; i < G.vexnum; ++i) {
        p = G.vertices[i].first;
        while(p){
            if(p -> adjvex == v)
                degree ++;
            p = p -> next;
        }
    }
    return degree;
}
//求出度
int GetOutDegreeX(AdGraph G,int v){
    int degree = 0;
    ArcNode *p = G.vertices[v].first;;
        while(p){
            degree ++;
            p = p -> next;
        }
        return degree;
}
//②已知无向图的邻接表
//求度
int GetDegree(AdGraph G,int v){
    int degree = 0;
    ArcNode *p;
    for (int i = 0; i < G.vexnum; ++i) {
        p = G.vertices[i].first;
        while(p){
            if(p -> adjvex == v)
                degree ++;
            p = p -> next;
        }
    }
    return degree;
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
求解有向图的度和度需要遍历整个图,对于每个顶点,统计其边和边的数量即可。 以下是用C语言实现求解有向图度和度的示例代码: ```c #include <stdio.h> #define MAX_VERTEX_NUM 100 // 最多顶点数 int main() { int v[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int inDegree[MAX_VERTEX_NUM] = {0}; // 度数组 int outDegree[MAX_VERTEX_NUM] = {0}; // 度数组 int vertexNum, edgeNum; // 顶点数和边数 // 读顶点数和边数 printf("请输顶点数和边数:"); scanf("%d%d", &vertexNum, &edgeNum); // 初始化邻接矩阵 for(int i = 0; i < vertexNum; i++) { for(int j = 0; j < vertexNum; j++) { v[i][j] = 0; } } // 读边 printf("请输每条边的起点和终点(顶点从0开始编号):\n"); for(int i = 0; i < edgeNum; i++) { int start, end; scanf("%d%d", &start, &end); v[start][end] = 1; // 标记邻接矩阵中对应位置为1 } // 统计度和度 for(int i = 0; i < vertexNum; i++) { for(int j = 0; j < vertexNum; j++) { if(v[i][j] == 1) { // 有一条从i到j的边 outDegree[i]++; // i的度+1 inDegree[j]++; // j的度+1 } } } // 输结果 printf("顶点 度\n"); for(int i = 0; i < vertexNum; i++) { printf("%d %d %d\n", i, outDegree[i], inDegree[i]); } return 0; } ``` 该代码实现了从标准输中读有向图的顶点数和边数,再读每条边的起点和终点,并使用邻接矩阵来表示有向图。然后统计每个顶点的度和度,并输结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值