图——DFS,BFS(邻接表)

DFS你可以当成树的先根遍历来做,BFS你可以当做树的层次遍历来做,这里因为图不一定是连通图,所以每个顶点都要尝试一下,用一个BOOL数组来表示这个顶点是否经历过遍历。

#include<iostream>
#include<queue>
using   namespace   std;

typedef  char VertexType;
typedef  int EdgeType;

const  int   MAXVEX = 100;

typedef  struct  EdgeNode//边表结点
{
    int adjvex;
    EdgeType weight;
    EdgeNode * next;
}EdgeNode;

typedef  struct  VertexNode//顶点表结点
{
    VertexType data;
    EdgeNode * firstedge;
}VertexNode,AdjList[MAXVEX];


typedef  struct  GraphAdjList//图
{
    AdjList  adjList;
    int numVertexes,numEdges;
}GraphAdjList;

EdgeNode * Buy_EdgeNode()
{
    EdgeNode * e = new EdgeNode();
    return e;
}


//无向图邻接表表示
void  CreateALGraph_Undirected(GraphAdjList * G)
{
    EdgeNode * e;
    int i,j,k;
    EdgeType w;
    cout<<"请输入顶点数和边数:"<<endl;
    cin>>G->numVertexes>>G->numEdges;
    cout<<"请输入顶点名称:"<<endl;
    for(i = 0;i < G->numVertexes;++i)//输入顶点
    {       
        cin>>G->adjList[i].data;
        G->adjList[i].firstedge = NULL;
    }
    
    for(k = 0;k < G->numEdges;++k)//完成邻接表的填写工作
    {
        printf("请输入边(vi,vj)上的下标i,下标j和权w:\n");
        cin>>i>>j>>w;
        e = Buy_EdgeNode();
        e->adjvex = j;
        e->weight = w;
        e->next = G->adjList[i].firstedge;
        G->adjList[i].firstedge = e;

        e = Buy_EdgeNode();
        e->adjvex = i;
        e->weight = w;
        e->next = G->adjList[j].firstedge;
        G->adjList[j].firstedge = e;
    }
}

//有向图邻接表表示
void  CreateALGraph_Directed(GraphAdjList * G)
{
    EdgeNode * e;
    int i,j,k;
    EdgeType w;
    cout<<"请输入顶点数和边数:"<<endl;
    cin>>G->numVertexes>>G->numEdges;
    cout<<"请输入顶点名称:"<<endl;
    for(i = 0;i < G->numVertexes;++i)//输入顶点
    {       
        cin>>G->adjList[i].data;
        G->adjList[i].firstedge = NULL;
    }
    
    for(k = 0;k < G->numEdges;++k)//完成邻接表的填写工作
    {
        printf("请输入边<vi,vj>上的下标i,下标j和权w:\n");
        cin>>i>>j>>w;
        e = Buy_EdgeNode();
        e->adjvex = j;
        e->weight = w;
        e->next = G->adjList[i].firstedge;
        G->adjList[i].firstedge = e;
    }
}


void  Show_ALGraph(GraphAdjList * G)
{
    for(int i = 0;i < G->numVertexes;++i)
    {
        cout<<G->adjList[i].data<<":  ";
        EdgeNode * e = G->adjList[i].firstedge;
        while(e)
        {
            cout<<G->adjList[e->adjvex].data<<"("<<e->weight<<")  ";
            e = e -> next;
        }
        cout<<endl;
    }
}


typedef  bool  Boolean;
Boolean  visited[MAXVEX];

//邻接表的DFS递归算法

void  DFS(GraphAdjList& G,int i)
{
    visited[i] = true;
    cout<< G.adjList[i].data<<"->";
    EdgeNode * p =  G.adjList[i].firstedge;
    while(p)
    {
        if(!visited[p->adjvex])
        {
            DFS(G,(p->adjvex));
        }
        p = p->next;        
    }
}

//邻接表的DFS遍历操作
void DFSTraverse(GraphAdjList& G)
{
    int i;
    for(i = 0;i < G.numVertexes;++i)
    {
        visited[i] = false;
    }
    for(i = 0;i < G.numVertexes;++i)
    {
        if(!visited[i])
        {
            DFS(G,i);
        }
    }
    cout<<endl;
}


//邻接表的BFS遍历操作
void BFSTraverse(GraphAdjList& G)
{
    queue<int> Q;
    int i,j;
    for(i = 0;i < G.numVertexes;++i)
    {
        visited[i] = false;
    }

    for(i = 0;i < G.numVertexes;++i)
    {
        if(!visited[i])
        {            
            visited[i] = true;
            Q.push(i);
            while(!Q.empty())
            {
                j =  Q.front();
               Q.pop();
               cout<< G.adjList[j].data<<"->";
               EdgeNode * p =  G.adjList[j].firstedge;
               while (p)
               {
                   if(!visited[p->adjvex])
                   {
                       visited[p->adjvex] = true;
                       Q.push(p->adjvex);
                   }
                   p = p->next;
               }        
            }
        }
    }
    cout<<endl;
}



int main()
{
    GraphAdjList *G = new GraphAdjList();
    CreateALGraph_Directed(G);
    Show_ALGraph(G);
    BFSTraverse(*G);
    DFSTraverse(*G);
    delete G;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值