6-34 图的深度遍历-邻接矩阵实现
本题要求实现邻接矩阵存储图的深度优先遍历。
函数接口定义:
void DFS(MGraph G,Vertex v);
其中MGraph是邻接矩阵存储的图,定义如下:
#define MaxVertexNum 10 /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
裁判测试程序样例:
#include"stdio.h"
#include"stdlib.h"
typedef enum{FALSE,TRUE} Boolean;
#define MaxVertexNum 10 /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
Boolean visited[MaxVertexNum]; /* 顶点的访问标记 */
void CreatMGraph(MGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void DFS(MGraph G,Vertex v);
int main()
{
Vertex v;
MGraph G;
CreatMGraph(&G);
scanf("%d", &v);
printf("DFS from %d:",v);
DFS(G,v);
return 0;
}
/* 你的代码将被嵌在这里 */
对于给定图:
输入样例:
第一行给出图的顶点数n和边数e,随后e行,每行给出一条边的两个顶点编号,最后一行给出遍历的起始顶点编号。
7 9
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
5
输出样例:
DFS from 5: 5 1 3 0 2 4 6
代码示例:
void DFS(MGraph G,Vertex v){
printf(" %d",v);
visited[v] = 1;
for(int w = 0;w<G.vexnum;w++){
if(G.arcs[v][w]&&!visited[w])
DFS(G,w);
}
}
6-35 图的广度遍历-邻接矩阵实现
本题要求实现邻接矩阵存储图的广度优先遍历。
函数接口定义:
void BFS(MGraph G,Vertex i);
其中MGraph是邻接矩阵存储的图,定义如下:
#define MaxVertexNum 10 /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
裁判测试程序样例:
#include"stdio.h"
#include"stdlib.h"
typedef enum{FALSE,TRUE} Boolean;
#define MaxVertexNum 10 /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
Boolean visited[MaxVertexNum]; /* 顶点的访问标记 */
void CreatMGraph(MGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void BFS(MGraph G,Vertex v);
int main()
{
Vertex v;
MGraph G;
CreatMGraph(&G);
scanf("%d", &v);
printf("BFS from %d:",v);
BFS(G,v);
return 0;
}
/* 你的代码将被嵌在这里 */
对于给定图:
输入样例:
第一行给出图的顶点数n和边数e,随后e行,每行给出一条边的两个顶点编号,最后一行给出遍历的起始顶点编号。
7 9
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
5
输出样例:
BFS from 5: 5 1 2 4 6 3 0
代码示例:
void BFS(MGraph G,Vertex v){
int q[1000],front = 0,rear = 0;
printf(" %d",v);
visited[v] = 1;
q[rear++] = v;
while(front!=rear){
int u = q[front++];//出队
for(int w = 0;w<G.vexnum;w++){
if(G.arcs[u][w]&&!visited[w]){
printf(" %d",w);
visited[w] = 1;
q[rear++] = w;
}
}
}
}
6-36 图的广度遍历-邻接表实现
本题要求实现邻接表存储图的广度优先遍历。
函数接口定义:
void BFS(ALGraph *G,int i);
其中ALGraph是邻接表存储的图,定义如下:
#define MAX_VERTEX_NUM 10 /*定义最大顶点数*/
typedef int Vertex;
typedef struct ArcNode{ /*表结点*/
int adjvex; /*邻接点域*/
struct ArcNode *nextarc; /*指向下一个表结点*/
}ArcNode;
typedef struct VNode{ /*头结点*/
Vertex data; /*顶点域*/
ArcNode *firstarc; /*指向第一个表结点*/
}VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是数组类型*/
typedef struct {
AdjList vertices; /*邻接表中数组定义*/
int vexnum,arcnum; /*图中当前顶点数和边数*/
} ALGraph; /*图类型*/
裁判测试程序样例:
#include"stdio.h"
#include"stdlib.h"
#define MAX_VERTEX_NUM 10 /*定义最大顶点数*/
typedef int Vertex;
typedef struct ArcNode{ /*表结点*/
int adjvex; /*邻接点域*/
struct ArcNode *nextarc; /*指向下一个表结点*/
}ArcNode;
typedef struct VNode{ /*头结点*/
Vertex data; /*顶点域*/
ArcNode *firstarc; /*指向第一个表结点*/
}VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是数组类型*/
typedef struct {
AdjList vertices; /*邻接表中数组定义*/
int vexnum,arcnum; /*图中当前顶点数和边数*/
} ALGraph; /*图类型*/
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MAX_VERTEX_NUM];/*定义标志向量,为全局变量*/
void CreatALGraph(ALGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void BFS(ALGraph *G,int v);
int main()
{
Vertex v;
ALGraph G;
CreatALGraph(&G);
scanf("%d", &v);
printf("BFS from %d:",v);
BFS(&G,v);
return 0;
}
/* 你的代码将被嵌在这里 */
对于给定图:
输入样例:
7 9
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
5
输出样例:
BFS from 5: 5 6 4 2 1 0 3
代码示例:
void BFS(ALGraph *G,int i){
int visited[MAX_VERTEX_NUM] = {0};
int queue[MAX_VERTEX_NUM];
int front = 0,rear = 0;
visited[i] = 1;
queue[rear++] = i;
while(front!=rear){
int c = queue[front++];
printf(" %d",c);
ArcNode* p = G->vertices[c].firstarc;
while(p){
int adjVertex = p->adjvex;
if(!visited[adjVertex]){
queue[rear++] = adjVertex;
visited[adjVertex] = 1;
}
p = p->nextarc;
}
}
}
6-37 图的深度遍历-邻接表实现
本题要求实现邻接表存储图的深度优先遍历。
函数接口定义:
void DFS(ALGraph *G,int i);
其中ALGraph是邻接表存储的图,定义如下:
#define MAX_VERTEX_NUM 10 /*定义最大顶点数*/
typedef int Vertex;
typedef struct ArcNode{ /*表结点*/
int adjvex; /*邻接点域*/
struct ArcNode *nextarc; /*指向下一个表结点*/
}ArcNode;
typedef struct VNode{ /*头结点*/
Vertex data; /*顶点域*/
ArcNode *firstarc; /*指向第一个表结点*/
}VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是数组类型*/
typedef struct {
AdjList vertices; /*邻接表中数组定义*/
int vexnum,arcnum; /*图中当前顶点数和边数*/
} ALGraph; /*图类型*/
裁判测试程序样例:
#include"stdio.h"
#include"stdlib.h"
#define MAX_VERTEX_NUM 10 /*定义最大顶点数*/
typedef int Vertex;
typedef struct ArcNode{ /*表结点*/
int adjvex; /*邻接点域*/
struct ArcNode *nextarc; /*指向下一个表结点*/
}ArcNode;
typedef struct VNode{ /*头结点*/
Vertex data; /*顶点域*/
ArcNode *firstarc; /*指向第一个表结点*/
}VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是数组类型*/
typedef struct {
AdjList vertices; /*邻接表中数组定义*/
int vexnum,arcnum; /*图中当前顶点数和边数*/
} ALGraph; /*图类型*/
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MAX_VERTEX_NUM];/*定义标志向量,为全局变量*/
void CreatALGraph(ALGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void DFS(ALGraph *G,int v);
int main()
{
Vertex v;
ALGraph G;
CreatALGraph(&G);
scanf("%d", &v);
printf("DFS from %d:",v);
DFS(&G,v);
return 0;
}
/* 你的代码将被嵌在这里 */
对于给定图:
输入样例:
第一行给出图的顶点数n和边数e,随后e行,每行给出一条边的两个顶点编号,最后一行给出遍历的起始顶点编号。
7 9
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
5
输出样例:
DFS from 5: 5 6 4 0 3 2 1
代码示例:
void DFS(ALGraph *G,int v){
printf(" %d",v);
visited[v] = 1;
for(ArcNode* p = G->vertices[v].firstarc;p;p = p->nextarc){
int w = p->adjvex;
if(!visited[w])
DFS(G,w);
}
}
6-38 求采用邻接矩阵作为存储结构的有向图各顶点的出度
本题要求实现一个函数,输出有向图每个顶点的数据元素的值,以及每个顶点的出度的值。
函数接口定义:
void outdegree(MGraph G);
G为采用邻接矩阵作为存储结构的有向图。
裁判测试程序样例:
#include <stdio.h>
#define MVNum 100 //最大顶点数
typedef struct{
char vexs[MVNum]; //存放顶点的一维数组
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
void outdegree(MGraph G);
void CreatMGraph(MGraph *G);/* 创建图 */
int main()
{
MGraph G;
CreatMGraph(&G);
outdegree(G);
return 0;
}
void CreatMGraph(MGraph *G)
{
int i,j,k;
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();
for(i=0;i<G->vexnum;i++)
scanf("%c",&G->vexs[i]);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j]=0;
for(k=0;k<G->arcnum;k++)
{
scanf("%d%d",&i,&j);
G->arcs[i][j]=1;
}
}
/* 请在这里填写答案 */
输入样例:
例如有向图
第一行给出图的顶点数n和弧数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条弧的两个顶点编号。
4 5
ABCD
1 0
2 0
2 1
3 2
3 1
输出样例:
输出n个顶点的元素值,顶点的数据类型为字符型。以及各顶点的出度值
A:0
B:1
C:2
D:2
代码示例:
void outdegree(MGraph G){
for(int i = 0;i<G.vexnum;i++){
int count = 0;
printf("%c:",G.vexs[i]);
for(int j = 0;j<G.vexnum;j++){
if(G.arcs[i][j]) count++;
}
printf("%d\n",count);
}
}
6-39 求采用邻接矩阵作为存储结构的有向图各顶点的入度
本题要求实现一个函数,输出有向图每个顶点的数据元素的值,以及每个顶点的入度的值。
函数接口定义:
void indegree(MGraph G);
G为采用邻接矩阵作为存储结构的有向图。
裁判测试程序样例:
#include <stdio.h>
#define MVNum 100 //最大顶点数
typedef struct{
char vexs[MVNum]; //存放顶点的一维数组
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
void indegree(MGraph G);
void CreatMGraph(MGraph *G);/* 创建图 */
int main()
{
MGraph G;
CreatMGraph(&G);
indegree(G);
return 0;
}
void CreatMGraph(MGraph *G)
{
int i,j,k;
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();
for(i=0;i<G->vexnum;i++)
scanf("%c",&G->vexs[i]);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j]=0;
for(k=0;k<G->arcnum;k++)
{
scanf("%d%d",&i,&j);
G->arcs[i][j]=1;
}
}
/* 请在这里填写答案 */
输入样例:
例如有向图
第一行给出图的顶点数n和弧数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条弧的两个顶点编号。
4 5
ABCD
1 0
2 0
2 1
3 2
3 1
输出样例:
输出n个顶点的元素值,顶点的数据类型为字符型。以及各顶点的入度值
A:2
B:2
C:1
D:0
代码示例:
void indegree(MGraph G)
{
for(int i = 0;i<G.vexnum;i++){
int count = 0;
printf("%c:",G.vexs[i]);
for(int j = 0;j<G.vexnum;j++){
if(G.arcs[j][i]) count++;
}
printf("%d\n",count);
}
}
6-40 求采用邻接矩阵作为存储结构的无向图各顶点的度
本题要求实现一个函数,输出无向图每个顶点的数据元素的值,以及每个顶点度的值。
函数接口定义:
void degree(MGraph G);
G为采用邻接矩阵作为存储结构的无向图。
裁判测试程序样例:
#include <stdio.h>
#define MVNum 100 //最大顶点数
typedef struct{
char vexs[MVNum]; //存放顶点的一维数组
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和边数
}MGraph;
void degree(MGraph G);
void CreatMGraph(MGraph *G);/* 创建图 */
int main()
{
MGraph G;
CreatMGraph(&G);
degree(G);
return 0;
}
void CreatMGraph(MGraph *G)
{
int i,j,k;
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();
for(i=0;i<G->vexnum;i++)
scanf("%c",&G->vexs[i]);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j]=0;
for(k=0;k<G->arcnum;k++)
{
scanf("%d%d",&i,&j);
G->arcs[i][j]=1;
G->arcs[j][i]=1;
}
}
/* 请在这里填写答案 */
输入样例:
例如无向图
第一行给出图的顶点数n和边数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条边的两个顶点编号。
4 5
ABCD
0 1
0 2
1 2
1 3
2 3
输出样例:
输出n个顶点的元素值,顶点的数据类型为字符型。以及各顶点的度值
A:2
B:3
C:3
D:2
代码示例:
void degree(MGraph G){
for(int i = 0;i<G.vexnum;i++){
int count = 0;
printf("%c:",G.vexs[i]);
for(int j = 0;j<G.vexnum;j++){
if(G.arcs[j][i]||G.arcs[i][j]) count++;
}
printf("%d\n",count);
}
}