图的实验1

确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。

源代码:

#include<iostream>    

#include<stdlib.h>      
using namespace std;    
const int Max=10;  //图中最多顶点个数  
int visited[Max]={0};  //设置已访问标志  
template<class T>    
class Graph    
{    
public:    
    Graph(T a[],int n,int e); //构造函数,建立具有n个顶点e条边的图  
    ~Graph(){}; //析构函数为空  
    void BFST(int v); //深度优先遍历图  
    void DFST(int v); //广度优先遍历图  
    void Pvertex(); //输出顶点的邻接点  
private:    
    T vertex[Max]; //存放图中顶点的一维数组  
    int arc[Max][Max]; //存放图中边的二维数组  
    int vertexNum, arcNum; //图中的顶点数和边数  
};    
template<class T>    
Graph<T>::Graph(T a[],int n,int e)    
{    
    int i,j,k;    
    vertexNum=n,arcNum=e;    
    for(i=0;i<vertexNum;i++)    
        vertex[i]=a[i]; //初始化邻接矩阵  
    for(i=0;i<vertexNum;i++)    
        for(j=0;j<vertexNum;j++)     
            arc[i][j]=0;    
    for(k=0;k<arcNum;k++) //依次输入每一条边(两个顶点确定一条边)  
    {    
        cout<<"输入两点的编号:\n";    
        cin>>i;    
        cin>>j;                   //输入边依附的两个顶点编号  
        arc[i][j]=1;arc[j][i]=1;  //有边标志  
    }    
}    
template<class T>    
void Graph<T>::DFST(int v)  //深度优先遍历图(递归调用)  
{    
    int j;    
    cout<<vertex[v];    
    visited[v]=1;       //防止重复访问相同顶点  
    for(j=0;j<vertexNum;j++)    
        if(arc[v][j]==1&&visited[j]==0) //访问未被访问的边   
            DFST(j);    
}    
template<class T>    
void Graph<T>::BFST(int v)  //广度优先遍历图(运用队列结构,非递归)  
{    
    int Q[Max];    
    int front=-1;   //初始化队列  
    int rear=-1;    
    cout<<vertex[v];   
    visited[v]=1;Q[++rear]=v;   //被访问顶点入队  
    while(front!=rear)  //队列为空时执行  
    {    
        v=Q[++front];  //将队头元素出队并送到v中  
        for (int j=0;j<vertexNum;j++)    
            if(arc[v][j]==1&&visited[j]==0)  //访问未被访问的边  
            {    
            cout<<vertex[j];    
            visited[j]=1;    
            Q[++rear]=j;    
            }    
    }    
}    
template<class T>  
void Graph<T>::Pvertex() //显示各个顶点的邻接点信息  
{  
    int i;int j;          
    for(i=0;i<vertexNum;i++)  //依次访问每个顶点  
    {  
        cout<<"顶点"<<vertex[i]<<"的邻接点为:"<<endl;  
        for(j=0;j<vertexNum;j++)       
          if(arc[i][j]==1)      //两点确定一条边,即通过边可确定顶点的邻接点,且有可能为多个邻接点  
          cout<<vertex[j]<<"   ";  
        cout<<endl;  
    }  
}  
int main()    
{  
    char S[6]={'A','B','C','D','E'};    
    Graph<char> G(S,5,6);    
    for(int i=0;i<Max;i++)    
    {visited[i]=0;} 
cout<<endl;
    cout<<"深度优先遍历的序列为:";    
    G.DFST(0);    
    cout<<endl;    
    for(i=0;i<Max;i++)    
    {visited[i]=0;}    
    cout<<"广度优先遍历的序列为:";    
    G.BFST(0);    
    cout<<endl;
    cout<<endl;
    cout<<"各顶点的邻接点信息如下:"<<endl;  
    G.Pvertex();  
    cout<<endl;  
    return 0;    

}   


运行结果图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值