算法与数据结构实验5:图的深度和广度优先遍历(邻接矩阵)

来源:互联网 发布:英语教练淘宝没了 编辑:程序博客网 时间:2024/06/04 19:49

Description

给定一个无向连通图,顶点编号从0到n-1,用深度优先搜索(DFS)和广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

Input

第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0<t<k),表示有k个顶点,m条边,t为遍历的起始顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

Output

两行,每行为用空格隔开的k个整数,对应一组数据,分别表示DFS和BFS的遍历结果。

Sample Input

6 7 0
0 3
0 4
1 4
1 5
2 3
2 4
3 5
Sample Output

0 3 2 4 1 5
0 3 4 2 5 1

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<queue>#define Max_Vertex_Num 100using namespace std;typedef struct node{    int vex[Max_Vertex_Num+10];//顶点向量    int arc[Max_Vertex_Num+10][Max_Vertex_Num+10];//邻接矩阵    int vexnum,arcnum;//顶点数和边数} Mgraph;int visit[Max_Vertex_Num+10];//访问数组void CreatMGraph(Mgraph *G)//创建邻接矩阵{    for(int i=1; i<=G->arcnum; i++)    {        int a,b;        cin>>a>>b;        G->arc[a][b]=G->arc[b][a]=1;//无向图    }}void DFS(Mgraph *G,int k){    visit[k]=1;    for(int i=0; i<G->vexnum; i++)        if(G->arc[k][i]&&!visit[i])        {            cout<<" "<<i;            DFS(G,i);        }}void DFS_Travel(Mgraph *G,int k){    memset(visit,0,sizeof(visit));    cout<<k;    DFS(G,k);//先遍历一遍以k为顶点出发的所有点    for(int i=0; i<G->vexnum; i++)    {        if(!visit[i])            DFS(G,i);    }}queue<int>q;void BFS(Mgraph *G,int k){    visit[k]=1;    q.push(k);    while(!q.empty())    {        int t=q.front();        q.pop();        visit[t]=1;        for(int i=0; i<G->vexnum; i++)        {            if(G->arc[t][i]&&!visit[i])            {                cout<<" "<<i;                visit[i]=1;                q.push(i);            }        }    }}void BFS_Travel(Mgraph *G,int k){    memset(visit,0,sizeof(visit));    cout<<k;    BFS(G,k);    for(int i=0; i<G->vexnum; i++)    {        if(!visit[i])            BFS(G,i);    }}int main(){    Mgraph G;    int k,m,t;    cin>>k>>m>>t;    G.vexnum=k;    G.arcnum=m;    CreatMGraph(&G);    DFS_Travel(&G,t);    cout<<endl;    BFS_Travel(&G,t);    cout<<endl;}
阅读全文
0 0