9
一、实验目的
1、掌握图的邻接矩阵和邻接表的存储和表示。
2、掌握图的一些基本应用。
3、掌握图的遍历方法。
4、掌握图的最小生成树算法。
5、掌握图的最短路径 Dijkstra 算法。
二、实验内容
1、采用邻接表存储图(要求完成)。
2、输入图并构造邻接矩阵(要求完成)。
3、采用深度优先和广度优先遍历图(要求完成)。
#include <stdio.h> #include <stdlib.h> #define Maxint 10000 //表示极大值 #define MVNum 20 //最大顶点数 typedef struct{ char vexs[MVNum]; //顶点表 int arcs[MVNum][MVNum]; //邻接矩阵 int vexnum, arcnum; //图的当前点数和边数 }AMGraph; typedef struct{ int *base; int front, rear; }Queue; int visit1[MVNum]; //深度优先遍历辅助数组 int visit2[MVNum]; //广度优先遍历辅助数组 int LocateVex(AMGraph *G, char x) { int i; for(i = 0; i < G->vexnum; i++) if(x == G->vexs[i]) return i; return -1; } void CreateUDN(AMGraph *G) //采用邻接矩阵表示法创建无向网 { int i, j, k; char a, b; printf("Input the vexnum and arcnum:"); scanf("%d %d", &G->vexnum, &G->arcnum); printf("Input the information of vertexes:n"); 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] = Maxint; printf("Enter the vertices attached to an edge in turn:n"); for(k = 0; k < G->arcnum; k++ ) { scanf(" %c,%c", &a, &b); i = LocateVex(G, a); j = LocateVex(G, b); G->arcs[i][j] = 1; G->arcs[j][i] = 1; } } void DFS(AMGraph *G, int a) //深度优先遍历 { int i; printf("%c", G->vexs[a]); visit1[a] = 1; for(i = 0; i < G->vexnum; i++) { if((G->arcs[a][i] != 0) && (!visit1[i]) ) DFS(G,i); } } void InitQueue(Queue *Q) { Q->base = (int*)malloc(20 * sizeof(int)); Q->rear = Q->front = -1; } void Enqueue(Queue *Q, int i) { Q->base[Q->rear++] = i; } int Dequeue(Queue *Q, int i) { i = Q->base[Q->front++]; return i; } int Emptyqueue(Queue *Q) { if (Q->front == Q->rear) return 1; else return 0; } void BFS(AMGraph *G, int a) //广度优先遍历 { Queue L; int i; InitQueue(&L); printf("%c", G->vexs[a]); visit2[a] = 1; Enqueue(&L, a); while (!Emptyqueue(&L)) { a = Dequeue(&L, a); for (i = 0; i < G->vexnum; i++) if (G->arcs[a][i] == 1 && visit2[i] == 0) { printf("%c",G->vexs[i]); visit2[i] = 1; Enqueue(&L, i); } } } int main() { int i; AMGraph G; for (i = 0; i < MVNum; i++) //初始化辅助数组 visit1[i] = 0; for (i = 0; i < MVNum; i++) visit2[i] = 0; CreateUDN(&G); printf("The result of DFS is:n"); DFS(&G, 0); printf("n"); printf("The result of BFS is:n"); BFS(&G, 0); printf("n"); return 0; }