Responsive image

问题 K: 第11关:基于邻接表的深度优先遍历

问题 K: 第11关:基于邻接表的深度优先遍历

时间限制: 1 Sec  内存限制: 128 MB
提交: 0  解决: 23
[提交][状态][讨论版][命题人:]

题目描述

一个连通图采用邻接表作为存储结构。设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程。
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;
typedef struct ArcNode
{//边结点
int data;
struct ArcNode *nextarc; //链域:指向下一条边的指针
}ArcNode;
typedef struct VNode
{//顶点信息
int data;
ArcNode *firstarc;  //链域:指向第一条依附该顶点的边的指针
}VNode,AdjList[MAXSIZE];    //AdjList表示邻接表类型
typedef struct
{//邻接表
AdjList vertices;
int vexnum,arcnum;    //图的当前顶点数和边数
}ALGraph;
typedef struct
{//顺序栈
int *base;          //栈底指针
int *top;           //栈顶指针
int stacksize;      //栈可用的最大容量
}SqStack;
void InitStack(SqStack &S)
{//顺序栈的初始化
S.base=new int[MAXSIZE];   //动态分配一个最大容量MAXSIZE的数组空间
S.top=S.base;           //top初始为base,空栈
S.stacksize=MAXSIZE;
}
void Push(SqStack &S,int e)
{//入栈操作
if(S.top-S.base==S.stacksize)   //栈满
return;
*S.top=e;    //元素e压入栈顶
S.top++;        //栈顶指针加1
}
void Pop(SqStack &S,int &e)
{//出栈操作
if(S.base==S.top)    //栈空
return;
S.top--;        //栈顶指针减1
e=*S.top;        //将栈顶元素赋给e
}
bool StackEmpty(SqStack S)
{//判空操作
if(S.base==S.top)    //栈空返回true
return true;
return false;
}
bool visited[MAXSIZE];    //访问标志数组,初始为false
int CreateUDG(ALGraph &G,int vexnum,int arcnum)
{//采用邻接表表示法,创建无向图G
    G.vexnum=vexnum;     //输入总顶点数
G.arcnum=arcnum;     //输入总边数
if(G.vexnum>MAXSIZE) return ERROR;  //超出最大顶点数则结束函数
int i,h,k;
for(i=1;i<=G.vexnum;i++)   //构造表头结点表
    {
        G.vertices[i].data=i;
        visited[i]=false;
        G.vertices[i].firstarc=NULL;
    }
    ArcNode *p1,*p2;
    for(i=0;i<G.arcnum;i++)   //输入各边,头插法构造邻接表
    {
        cin>>h>>k;
        p1=new ArcNode;
        p1->data=k;
        p1->nextarc=G.vertices[h].firstarc;
        G.vertices[h].firstarc=p1;
        p2=new ArcNode;
        p2->data=h;
        p2->nextarc=G.vertices[k].firstarc;
        G.vertices[k].firstarc=p2;
    }
    return OK;
}
void DFS(ALGraph G,int v,SqStack S)
{//从第v个顶点出发非递归实现深度优先遍历图G
/**************begin************/
   









   
    /**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
ALGraph G;
SqStack S;
CreateUDG(G,n,m);   //创建无向图G
int d;             //从d开始遍历
cin>>d;
DFS(G,d,S);    //基于邻接表的深度优先遍历
}
return 0;
}

输入描述

多组数据,每组m+2数据行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个整数h和k,代表边依附的两个顶点。第m+2行有一个整数d,代表从d开始遍历。当n和m都等于0时,输入结束。

输出描述

每组数据输出一行,为深度优先搜索的遍历结果。每两个数字之间用空格隔开。

样例输入

3 2
1 2
1 3
1
2 1
1 2
2
0 0

样例输出

1 2 3
2 1

提示


组合提交代码,你需要提交



void DFS(ALGraph G,int v,SqStack S)

{//从第v个顶点出发非递归实现深度优先遍历图G

/**************begin************/

   



















   

    /**************end************/

}





[提交][状态]
ACM算法攻关部