邻接矩阵:
G=(V,E)
A(i,j)=1: 若<vi,vj>或<vj,vi>是E(G)中的边
A(i,j)=0; 若<vi,vj>或<vj,vi>不是E(G)中的边
带权值的邻接矩阵:
A(i,j)=Wij,若<vi,vj>或<vj,vi>是E(G)中的边
A(i,j)=0 || 无穷大,若<vi,vj>或<vj,vi>不是E(G)中的边
邻接矩阵表示法的空间复杂度为: S(n)=O(n^2) .
邻接表:
链式存储,结构: |data|adj|
邻接表中每个结点均有两个域:
邻接点域:adjvex
链域:next
表示n个顶点,e条边 时间复杂度: O(n+e)
1、连通图的广度优先遍历算法:
(1):顶点V入队列;
(2): 当队列非空时继续执行,否则算法结束。
(3): 出队列取得队头顶点V,访问顶点V,并标记顶点V已经被访问。
(4): 查找顶点V的第一个邻接顶点col。
(5): 若V的邻接顶点col未被访问过的,则col入队列。
(6): 继续查找顶点V的另一个新的邻接顶点col,转到步骤(5)。知道顶点V的所有未被访问过的临界点处理完,转到步骤(2)。
邻接矩阵的广度优先遍历算法:
void AdjMWGraph::Depth(int v,int visited[])
{
sqQueue <int> q;
q.EnQueue();
while(!q.IsEmpty())
{
v=q.Dequeue();
cout<<endl<<"顶点"<<v+1<<"权值"<<Vertices[col];//访问顶点V
visited[col]=1;
for(int col=0;col<numV;col++)
{
if(Edge[v][col]>0 && Edge[v][col]<MaxWeight && visited[col] == 0)
{
q.EnQueue(col);
}
}
}
cout<<endl<<"end ! "<<endl;
}
邻接矩阵表示图时,搜索一个顶点的所有邻接点花费O(n)的时间,则从N个顶点出发搜索的时间为O(n^2),即BFS的算法时间复杂度为O(n^2).
邻接表的广度优先遍历算法:
void AdjTWGraph::Broad(int v,int visited[])
{
sqQueue <int> q;
q.EnQueue(v);
while(!q.IsEmpty())
{
v=q.Dequeue();
cout<<endl<<"顶点"<<v+1<<"权值"<<Vertices[col];//访问顶点V
visited[v]=1;
p=Vertices[v].adj;
while(p!=NULL)
{
vj=p->data;
if( visited[vj]== 0)
{
q.EnQueue(vj);
}
p = p->next;
}
}
cout<<endl<<"end ! "<<endl;
}