邻接矩阵法:
#define MaxVertexNum 100 //顶点数目最大值
typedef struct
char Vex[MaxVertexNum]; //顶点表
int Edge[MaxVertexNum][MaxVertexNum]; //二维数组存储边的信息
int Vexnum,arcnum; //图的当前顶点数和边数/arc:弧
}MGraph;
这种存储方法导致空间复杂度很高。达到O(n^2),适用于稠密图。
图的广度优先遍历(BFS):
Breadth-First-Search
1.找到与一个顶点相邻的所有顶点
2.标记哪些顶点被访问过
3.需要一个辅助队列
FirstNeighbor(G,x):求图G顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或者图中不存在x,则返回-1.
NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1.
//图的广度优先遍历
bool visited[MAX_VERTEX_NUM]; //访问标记数组,初始都为false
void BFSTraverse(Graph G){ //对图G进行广度优先遍历
for(i=0;i<G.vexnum;i++){
visited[i]=FALSE;
InitQueue(Q); //初始化队列Q
for(i=0;i<G.vexnum;i++)
if(!visited[i]) //对每个连通分量调用一次BFS(只需要找false的点)
BFS(G,i); //因为可能有没有连通的两个图
}
void BFS(Graph G,int v){ //从顶点v出发,广度优先遍历图G
visit(v); //访问初始顶点v
visited[v]=TRUE; //已经访问记为TRUE
Enqueue(Q,v); //顶点v加入队列Q
while(!isEmpty(Q)){ //队列不空时
Dequeue(Q,v); //顶点v出队
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
//检测v的所有邻接点
if(!visited[w]){//w为v没有访问过的邻接结点
visit(w); //访问顶点w
visited[w]=TRUE;
EnQueue(Q,w);
}
}
}
图的深度优先遍历(DFS):
递归算法,类似树的先序遍历。
如果是非连通图,则无法遍历完所有结点。
bool visited[MAX_VERTEX_NUM]; //访问标记数组,初始都为false
void DFSTraverse(Graph G){ //对G进行深度优先遍历
for(v=0;v<G.vexnum;v++){
visited[v]=FALSE; //初始化
for(v=0;v<G.vexnum;v++) //v从0开始遍历
if(!visited[v])
DFS(G,v);
}
void DFS(Graph G,int v){ //从顶点v出发,深度优先遍历图G
visit(v);
visited[v]=TRUE;
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
if(!visited[w])
DFS(G,w); //递归调用
}
}