图的深度优先搜索/广度优先搜索(邻接表实现)

//深度优先遍历图返回连通分量数-
int dfstraverse(LinkedGraph q)
{
    int i,count=0;
    for(i=0;i<q.n;i++)
        visitnode[i]=0;
    for(i=0;i<q.n;i++)
        if(!visitnode[i])
        {
            printf("#DFS->CASE[%d]:\n",count);
            count++;
            dfs(q,i);
        }
    return count;
}
void DFS(LinkedGraph q)
{
    int i,j;
    for(i=0;i<q.n;i++)
    {
        for(j=0;j<q.n;j++)
            visitnode[j]=0;
        printf("\n");
        dfs(q,i);
    }
}
void bfs(LinkedGraph g,int i)
{
    int j;
    EdgeNode *p;
    int queue[M],front=0,rear=0;
    printf("%c\n",g.adjlist[i].vartex);
    visitnode[i]=1;
    queue[rear++]=i;//输出被访问节点,并将其入队
    while(front<rear)//当队不空
    {
        j=queue[front++];//出队
        p=g.adjlist[j].FirstEdge;//定为到该节点的第一条边
        while(p)
        {
            if(visitnode[p->adjvex]==0)//如果该条边的顶点未访问
            {
                printf("%c\n",g.adjlist[p->adjvex].vartex);//输出该边的顶点
                queue[rear++]=p->adjvex;//把这条边的顶点入队
                visitnode[p->adjvex]=1;//标记访问过该顶点
            }
            p=p->next;//访问下一条边
        }
    }
}
//广度优先遍历图返回连通分量数
int bfstraverse(LinkedGraph g)
{
    int i,count=0;
    for(i=0;i<g.n;i++)
        visitnode[i]=0;
    for(i=0;i<g.n;i++)
        if(!visitnode[i])
    {
        printf("#BFS->CASE[%d]:\n",count);
        count++;
        bfs(g,i);
    }
    return count;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-02-05 10:56  Thereisnospon  阅读(470)  评论(0编辑  收藏  举报