chenglong7997

邻接表存储图,深度和广度优先遍历


就拿这个图做实验了
#include<iostream>
#include<vector>
#include<queue>
 
using namespace std;
 
struct ArcNode{             //弧结点结构
    int adjvex;             //邻接顶点
    ArcNode *nextarc;       //下一条弧
};
 
template <class T>
struct VertextNode{         //表头结点结构
    T Vertext;          //顶点
    ArcNode* firstArc;      //第一条弧
};
 
const int MAXSIZE=10;
template<class T>
class ALGraph{
public:
    ALGraph(T a[],int n,int e);
    ~ALGraph();
    void DFS(int v);
    void BFS(int v);
     
    vector<int> visited;
private:
    VertextNode<T> adjlist[MAXSIZE];      //顶点
    int vNum,arcNum;                    //顶点和弧的数目
     
};
 
template <class T>
ALGraph<T>::ALGraph(T a[],int n,int e){
    vNum=n;
    arcNum=e;
    visited.assign(vNum,0);
    for(int k=0;k<n;k++){                //k是局部变量
        adjlist[k].Vertext=a[k];        //初始化顶点
        adjlist[k].firstArc=NULL;       //初始化弧
    }
    cout<<"Input the vertexts of each arc."<<endl;
    int i,j;
    for(int k=0;k<e;k++){
        cin>>i>>j;
        ArcNode *arc=new ArcNode;
        arc->adjvex=j;
        arc->nextarc=adjlist[i].firstArc;        //头插法建立链表
        adjlist[i].firstArc=arc;
    }
}
/*可发看到建立邻接表的时间复杂度为O(n+e)*/
<br>
template <class T>
void ALGraph<T>::DFS(int v){
 
    cout<<adjlist[v].Vertext<<endl;                 
    visited[v]=1;
    ArcNode *p=adjlist[v].firstArc;
    while(p){
        int j=p->adjvex;
        if(visited[j]==0)
            DFS(j);
        p=p->nextarc;
    }
}
 
template <class T>
void ALGraph<T>::BFS(int v){
    queue<int> q;             //一个空队列
     
    cout<<adjlist[v].Vertext<<endl;
    visited[v]=1;
    q.push(v);          //v入队
    while(!q.empty()){
        int h=q.front();        //获取队首元素
        q.pop();            //队首元素出队
        ArcNode *p=adjlist[h].firstArc;
        while(p){
            int j=p->adjvex;
            if(visited[j]==0){
                cout<<adjlist[j].Vertext<<endl;
                visited[j]=1;
                q.push(j);      //元素入队
            }
            p=p->nextarc;
        }
    }
}
 
int main(){
    int arr[6]={0,1,2,3,4,5};
    ALGraph<int> *g=new ALGraph<int>(arr,6,6);
    cout<<"<<----------DFS-------------->>"<<endl;
    g->DFS(0);
    g->visited.assign(6,0);
    cout<<"<<----------BFS-------------->>"<<endl;
    g->BFS(0);
    return 0;
}
原文来自:博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun

posted on 2012-03-28 04:39 Snape 阅读(375) 评论(0)  编辑 收藏 引用 所属分类: C++ 转载


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

my

搜索

最新评论

阅读排行榜

评论排行榜