图是表示“多对多”的关系,包含一组顶点和一组边,一组顶点通常用V(Vertex)表示顶点集合,一组边通常用E(Edge)表示边的集合。
边是顶点对:(v,w) 属于E,其中v,w属于V
有向边 < v,w > 表示从v指向w的边
1邻接矩阵表示法:
邻接矩阵G[N][N]-N个顶点从0到N-1编号
对于有权路径的图G[i][j] = 1表示 < vi, vj >有边,否则表示没边
对于稀疏图存在空间浪费的问题
2邻接表的表示方法:
邻接表:G[N]为指针数组,对应矩阵每行一个链表, 只存非0元素
3图的遍历
(1)深度优先搜索
void DFS(Vertex v) {
visited[v] = true;
for(v的每个邻接点w) {
if(!visited[w]) {
DFS(w);
}
}
}
若图有N个顶点,E条边,时间复杂度是使用邻接表存储图为O(N+E),使用邻接矩阵存储为O(
N2
)
(2)广度优先搜索
void BFS(Vertex v) {
visited[v] = true;
AddQ(v, Q);
while(!IsEmpty(Q)) {
v = DeleteQ(Q);
for(v的每一个邻接点w) {
if(!visited[w]) {
visited[w] = true;
AddQ(w, Q);
}
}
}
}