目录
图的存储方法
邻接矩阵存储法
定义存储结构类型
#define Max 20 ///先定义一个能储存足够大的顶点个数
typedef struct
{
char vexs[Max];///顶点表,设为字符型
int edges[Max][Max];///邻接矩阵。一般(图的邻接--0&1)(网的邻接--权值&无穷)
int vnum,Enum;///顶点数,边数
} MGrape;
建立图的邻接矩阵存储
void CreateMGrape(MGrape *G)///要改变参数的值,所以用指针类型
{
cout<<"输入顶点数和边数:\n";
cin>>G->vnum>>G->Enum;
cout<<"输入顶点\n";
for(int i=0; i<G->vnum; ++i)
cin>>G->vexs[i]; ///输入顶点信息,建立顶点表
for(int i=0; i<G->vnum; ++i) ///邻接矩阵初始化
for(int j=0; j<G->vnum; ++j)
G->edges[i][j]=0;
cout<<"输入边:\n";
for(int i=0; i<G->Enum; ++i)
{
int r,c;///行 列
cin>>r>>c; ///输入边信息,每条边以顶点的序号序偶表示
G->edges[r][c]=1;
G->edges[c][r]=1;///若是有向图,注释掉此行。
}
}
邻接表存储法
定义结构类型
#define Max 20 ///先定义一个能储存足够大的顶点个数
typedef struct
{
char vexs[Max];///顶点表,设为字符型
int edges[Max][Max];///邻接矩阵。一般(图的邻接--0&1)(网的邻接--权值&无穷)
int vnum,Enum;///顶点数,边数
} MGrape;
typedef struct node
{
int id_v;///顶点位置编号
struct node *next; ///指向下一邻接点(边)
int info;///边的权值,适用于网图
}EdgeNode; ///边结点
typedef struct vnode
{
char v;///顶点信息,定义为字符型
EdgeNode *firstedge;///指向第一条边
}VNode;///顶点结点
typedef struct
{
VNode List[Max];///邻接表
int Vnum,Enum;///点数,边数
}ALGrape;
建立有向图的邻接表存储
void CreateALGrape(ALGrape *G)
{
EdgeNode *s;
cout<<"输入顶点数和边数:\n";
cin>>G->Vnum>>G->Enum;
cout<<"输入顶点:\n";
for(int i=0; i<G->Vnum; i++) ///建立顶点表
{
cin>>G->List[i].v;///读入顶点信息
G->List[i].firstedge=NULL;/// 顶点的边表头指针置空
}
cout<<"输入边:\n";
for(int i=0; i<G->Enum; ++i) ///建立边表
{
int a,b;///读入边<Va,Vb>的顶点序号对偶
cin>>a>>b;
s=new(EdgeNode);///生成新的边表结点
s->id_v=b; ///邻接点的编号为b
s->next=G->List[a].firstedge;///将行结点s插入a的后面
G->List[a].firstedge=s;
}
}
注:不理解代码的时候,画图理解
遍历
深度优先搜索DFS
int flag[Max]={0};
void visit(char ch)
{
cout<<ch;
}
void DFS(ALGrape *G,int i)
{
///以顶点i为起点,进行邻接表图G进行深搜
EdgeNode *p;
visit(G->List[i].v);///访问顶点i
flag[i]=1;///标记已经访问
p=G->List[i].firstedge;/// 取点i的邻接边表的头指针
while(p)
{
int j=p->id_v;///搜索i的邻接点j
if(!flag[j])///如果没有访问过就,则对j进行DFS
DFS(G,j);
p=p->next; ///找i的下一个邻接点
}
}
void DFSVisit(ALGrape* G)
{
///对图G遍历
for(int i=0;i<G->Vnum;++i)
if(!flag[i])
DFS(G,i);
}
广度优先搜索BFS
void visit(char ch)
{
cout<<ch;
}
void BFS(MGrape *G,int i)
{
///对邻接矩阵存的图G以点i为起点进行广搜
int Q[Max],front=0,rear=-1;///定义队列
visit(G->vexs[i]); ///访问顶点i;
flag[i]=1;
rear++;Q[rear]=i;///点i入队
while(front<=rear)///当队不空时,
{
i=Q[front];front++;///出队
for(int j=0;j<G->vnum;++j)
{///依次访问点i的邻接点
if(G->edges[i][j]==1&&!flag[j])
{
visit(G->vexs[j]);
flag[j]=1;
rear++;Q[rear]=j;///访问后点j进行入队
}
}
}
}
void BFSVisit(MGrape *G)
{///对图G进行广度优先遍历
for(int i=0;i<G->vnum;++i)
if(!flag[i])
BFS(G,i);
}
注:对于连通图而言,调用一次BFS就能访问所有结点。对于非连通图,只能遍历包括出发点的连通分量。