图的深度优先搜索(邻接表)
Description
图采用邻接表存储,图中顶点数为n(0< n <20),顶点信息为整数,依次为0,1,…,n-1。
编写函数,输入图的类型,0:无向图,1:有向图;输入图的顶点数、边数、边的偶对,建立邻接表(单链表的插入采用头插法);
编写函数,实现图的深度优先搜索,输出深度优先搜索序列。
调用上述函数,从0号顶点开始,输出图的深度优先搜索序列,以空格分隔。
Input
第1行:图的类型 ( 0:无向图,1:有向图)
第2行:图的顶点数,边数
第3行开始,每行一个边的偶对,如vi,vj
Output
以空格分隔的深度优先遍历序列
Sample Input
0
6,7
0,1
0,2
0,4
1,4
2,5
3,4
3,5
Sample Output
0 4 3 5 2 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAX_VERTEX_NUM 100 //图中最大定点数为100
using namespace std;
typedef struct ArcNode //表节点
{
int adjvex; //该弧所指向的顶点编号
struct ArcNode *nextarc; //指向下一条弧的指针
int weight; //若G为网,weight表示边上的权值
} ArcNode;
typedef struct VNode
{
int vertex; //顶点信息
ArcNode *firstarc; //指向第一条依附于该定点的弧的指针
} VNode;
typedef VNode AdjList[MAX_VERTEX_NUM]; //表头向量
typedef struct
{
AdjList adjlist; //邻接表
int vexnum; //顶点数
int arcnum; //边数
} ALGragh;
int visit[MAX_VERTEX_NUM+50];
void CreateALGraph1(ALGragh *G)//无向图的建立
{
ArcNode *p;
int i,j,k;
//cout<<"输入顶点数和边数(逗号分隔)"<<endl;
char ch;
cin>>G->vexnum>>ch>>G->arcnum;
for(i=0; i<G->vexnum; i++)
{
G->adjlist[i].vertex=i;
G->adjlist[i].firstarc=NULL;
}
int T=G->arcnum;
while(T--)//头插法建立链表
{
cin>>i>>ch>>j;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=i;
p->nextarc=G->adjlist[j].firstarc;
G->adjlist[j].firstarc=p;
}
}
void CreateALGraph2(ALGragh *G)//有向图的建立
{
ArcNode *p;
int i,j,k;
//cout<<"输入顶点数和边数(逗号分隔)"<<endl;
char ch;
cin>>G->vexnum>>ch>>G->arcnum;
for(i=0; i<G->vexnum; i++)
{
G->adjlist[i].vertex=i;
G->adjlist[i].firstarc=NULL;
}
int T=G->arcnum;
while(T--)//头插法建立链表
{
cin>>i>>ch>>j;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
}
void DFS(ALGragh *G,int k)
{
ArcNode *p;
cout<<G->adjlist[k].vertex<<" ";
visit[k]=1;
p=G->adjlist[k].firstarc;
while(p!=NULL)
{
int t=p->adjvex;
if(!visit[t])
DFS(G,t);
p=p->nextarc;
}
}
void DFSTraverse(ALGragh *G,int n)
{
memset(visit,0,sizeof(0));
for(int i=0; i<G->vexnum; i++)
if(!visit[i])
DFS(G,i);
}
int main()
{
int flag;
ALGragh G;
cin>>flag;
if(flag==0)
CreateALGraph1(&G);
else
CreateALGraph2(&G);
DFSTraverse(&G,0);
}