//以下为深度优先遍历DFS
int GraphFirstAdj(AlGraph &G,int v)
{
if(G.vertices[v].firstarc)
return G.vertices[v].firstarc->adjvex;
return -1;
}
int GraphNextAdj(AlGraph &G,int v,int w)
{
ArcNode *p=G.vertices[v].firstarc;
while(p->adjvex!=w)
{
p=p->next;
}
p=p->next;
if(p)
return p->adjvex;
else
return -1;
}
void DFS(AlGraph &G,int v)
{
//从第v个顶点出发递归地深度优先遍历图G
visited[v]=1; visit(G,v);//访问v顶点并将该顶点设为已访问
for(int w=GraphFirstAdj(G,v);w!=-1;w=GraphNextAdj(G,v,w))//-1退出
{
if(!visited[w])
DFS(G,w);//对v的上文访问的邻接顶点w递归调用
}
}
void DFSTraverse(AlGraph &G)
{
for(int v=0;v<G.vernum;v++)//访问数组初始化
visited[v]=0;
for(int v=0;v<G.vernum;v++)
{
if(!visited[v])
DFS(G,v);//对未访问的顶点调用DFS
}
}
//以下为广度优先遍历BFS
void BFSTraverse(AlGraph &G)
{
//广度优先遍历
for(int v=0;v<G.vernum;v++)
visited[v]=0;
Queue Q;
QueueInit(Q);//辅助队列Q
for(int v=0;v<G.vernum;v++)
if(!visited[v])
{
QueueIn(Q,v);
visited[v]=1;
visit(G,v);
int u;
while(!QueueEmpty(Q))
{
QueueOut(Q,u);//对头元素出队列并置为u
for(int w=GraphFirstAdj(G,u);w!=-1;w=GraphNextAdj(G,u,w))
{
if(!visited[w])
{
QueueIn(Q,w);//u的尚未访问的邻接顶点w入队列Q
visited[w]=1;
visit(G,w);
}
}
}
}
}
int main()
{
AlGraph G;
CreateAdjList(G);
DFSTraverse(G);
cout<<endl;
BFSTraverse(G);
cout<<endl;
cout<<G.vernum<<" "<<G.arcnum<<endl;
cout<<endl;
return 0;
}