图
图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
图的应用极为广泛,已渗入到诸如语言学、逻辑学、物理、化学、电讯、计算机科学以及数学的其它分支。
一个图(G)定义为一个偶对(V,E),记为G=(V,E) 。其中:V是顶点(Vertex)的非空有限集合,记为V(G);E是无序集(V,V)的一个子集,记为E(G) ,其元素是图的弧(Arc)。
图的分类
有向图(Digraph):若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是有序的,称图G是有向图。
在有向图中,若 <v,w>在关系集合E(G)中,表示从顶点v到顶点w有一条弧。其中:v称为弧尾(tail)或始点(initial node),w称为弧头(head)或终点(terminal node) 。
无向图(Undigraph): 若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是无序的,称图G是无向图。
度
对于无向图G=(V,E),图G中依附于vi的边的数目称为顶点vi的度(degree),记为TD(vi)。
对有向图G=(V, E),图G中以vi作为起点的有向边(弧)的数目称为顶点vi的出度(Outdegree),记为OD(vi) ;以vi作为终点的有向边(弧)的数目称为顶点vi的入度(Indegree),记为ID(vi) 。顶点vi的出度与入度之和称为vi的度,记为TD(vi) 。
邻接矩阵
对于有n个顶点的图,用一维数组vexs[n]存储顶点信息,用二维数组A[n][n]存储顶点之间关系的信息。该二维数组称为邻接矩阵。在邻接矩阵中,以顶点在vexs数组中的下标代表顶点,邻接矩阵中的元素A[i][j]存放的是顶点i到顶点j之间关系的信息。
接下来看一下存储结构:邻接矩阵:
typedef int EdgeType;
typedef struct{
VertexType vexs[MaxVerNum]; //字符类型数组,存储顶点信息
EdgeType edges[MaxVerNum][MaxVerNum]; //整型,邻接矩阵,存图中的边
int vnum, eenum; // vum是记录图的顶点数,eenum是记录图中边的个数
}MGraph;
在创建完毕后,接下来写一个创造函数:
```c
void CreateMGraph(MGraph *G)
{
int i,j,k;
printf("请输入顶点数和弧数(输入格式为:顶点数,弧数):\n");
scanf("%d,%d", &G->vnum, &G->eenum);
printf("请输入顶点信息(输入格式为:顶点号):\n");
getchar();
for(i=0;i<G->vnum;i++)
scanf("%c",&G->vexs[i]);
for(i=0;i<G->vnum;i++)
for(j=0;j<G->vnum;j++)
G->edges[i][j]=0;
getchar();
printf("请输入每条弧对应的两个顶点的序号(输入格式为:i,j):\n");
for(k=0;k<G->eenum;k++)
{
scanf("%d,%d", &i, &j);
G->edges[i][j]=1;
}
}
进行度数的统计:
```c
void Cdegree(MGraph *G)
{
int i,j,in,out,count;
for(i=0;i<G->vnum;i++)
{
in=out=count=0;
for(j=0;j<G->vnum;j++)
{
if(G->edges[i][j])
out++;
if(G->edges[j][i])
in++;
}
count=in+out;
printf("结点%c:入度:%d 出度:%d 度:%d\n",G->vexs[i], in,out,count);
}
}
好了,现在基本的功能:创建图和图的度数统计已经完成!
下篇文章将讲解如何进行DFS和BFS
完整的代码:
#include<stdio.h>
#include<stdlib.h>
#define MaxVernum 20
#define MaxVerNum 20
typedef char VertexType;
typedef int EdgeType;
typedef struct{
VertexType vexs[MaxVerNum]; //字符类型数组,存储顶点信息
EdgeType edges[MaxVerNum][MaxVerNum]; //整型,邻接矩阵,存图中的边
int vnum, eenum; // vum是记录图的顶点数,eenum是记录图中边的个数
}MGraph;
//到此创建完毕图的邻接矩阵的储存结构
//下一步来create一下
void CreateMGraph(MGraph *G)
{
int i,j,k;
printf("请输入顶点数和弧数(输入格式为:顶点数,弧数):\n");
scanf("%d,%d", &G->vnum, &G->eenum);
printf("请输入顶点信息(输入格式为:顶点号):\n");
getchar();
for(i=0;i<G->vnum;i++)
scanf("%c",&G->vexs[i]);
for(i=0;i<G->vnum;i++)
for(j=0;j<G->vnum;j++)
G->edges[i][j]=0;
getchar();
printf("请输入每条弧对应的两个顶点的序号(输入格式为:i,j):\n");
for(k=0;k<G->eenum;k++)
{
scanf("%d,%d", &i, &j);
G->edges[i][j]=1;
}
}
//下面进行度数的统计::
void Cdegree(MGraph *G)
{
int i,j,in,out,count;
for(i=0;i<G->vnum;i++)
{
in=out=count=0;
for(j=0;j<G->vnum;j++)
{
if(G->edges[i][j])
out++;
if(G->edges[j][i])
in++;
}
count=in+out;
printf("结点%c:入度:%d 出度:%d 度:%d\n",G->vexs[i], in,out,count);
}
}
int main()
{
MGraph *G =(MGraph *)malloc(sizeof(MGraph));
CreateMGraph(G);
Cdegree(G);
}
测试用例如图所示:
对应的实际图为:
所对应的邻接矩阵为:
自己的第一篇CSDN,如果有更好的思路,请批评指正!