/**
* 总:度(入度、出度)求解、边数求解
* 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;
}
度(入度、出度)求解、边数求解
最新推荐文章于 2023-05-26 21:50:01 发布