图实验

#include<iostream.h>  
const int Max = 10;  
template<class T>  
class MGraph  
{  
public:  
    MGraph(T a[],int n,int e);   //n个结点e条边的图  
    ~MGraph(){}  
    void DFSTraverse(int v);    //深度优先遍历  
    void BFSTraverse(int v);    //广度优先遍历  
    void visit();  
private:  
    T vertex[Max];  
    int arc[Max][Max];  
    int vertexNum,arcNum;  
    int visited[Max];  
    int Q[Max];  
    int front,rear;  
};  
  
//构造函数  
template<class T>  
MGraph<T>::MGraph(T a[],int n,int e)  
{  
    int i,j;  
    vertexNum=n;  arcNum=e;  
    for(i=0;i<vertexNum;i++)  
    {  
        vertex[i] = a[i];  
    }  
    for(i=0;i<vertexNum;i++)  
        for(int j=0;j<vertexNum;j++)  
            arc[i][j] = 0;  
    cout<<"请输入边(两端的顶点下标):"<<endl;  
    for(int k=0;k<arcNum;k++)  
    {  
        cin>>i>>j;  
        arc[i][j]=1;  
        arc[j][i]=1;  
        cout<<"该边为:"<<vertex[i]<<vertex[j]<<endl;  
    }  
}  
  
//定义一个将visiited[]初始化为0的函数,每次遍历前先调用该函数  
template<class T>  
void MGraph<T>::visit()  
{  
    for(int i=0;i<Max;i++){  
        visited[i]=0;  
    }  
}  
  
//深度优先遍历  
template<class T>  
void MGraph<T>::DFSTraverse(int v)    //以v为起点  
{  
    cout<<vertex[v]; visited[v]=1;  
    for(int j=0;j<vertexNum;j++){  
        if(arc[v][j]==1 && visited[j]==0){  
            DFSTraverse(j);     //访问与v相邻且未被访问过的点  
        }  
    }  
      
}  
  
//广度优先遍历  
template<class T>  
void MGraph<T>::BFSTraverse(int v)  
{  
    //将队列置为空  
    front=rear=-1;  
    cout<<vertex[v]; visited[v]=1; Q[++rear]=v;   //结点v入队  
    while(front!=rear)  
    {  
        v=Q[++front];   //v出队  
        for(int j=0;j<vertexNum;j++){       //访问所有与v相邻的顶点  
            if(arc[v][j]==1 && visited[j]==0)  
            {  
                cout<<vertex[j]; visited[j]=1;Q[++rear]=j;  
            }  
        }  
    }  
  
}  
  
//主函数  
int main()  
{  
    char arr[Max];  
    int a,c=0,flag=1,tab,n;  
    cout<<"请按序输入图的顶点(输入“#”结束):";  
    for(int i=0; i<Max; i++)  
    {  
        cin>>arr[i];  
        if(arr[i] == '#')  break;  
        c++;  
    }  
    cout<<"请输入该图的边数:";  
    cin>>a;  
    MGraph<char> m(arr,c,a);  
  
    cout<<"请选择深度/广度优先遍历:"<<endl;  
    while(flag)  
    {  
        cout<<"[1]深度   [2]广度\t:";  
        cin>>tab;  
        cout<<"请输入起点下标:";  
        switch(tab)  
        {  
        case 1:    
            {   
                cin>>n;  
                m.visit();  
                cout<<"[深度]";  
                m.DFSTraverse(n);  
                cout<<endl;  
                break;  
            }  
              
        case 2:    
            {   
                cin>>n;  
                m.visit();  
                cout<<"[广度]";  
                m.BFSTraverse(n);  
                cout<<endl;  
                break;  
            }  
        default:  
            {  
                flag=0;  
                cout<<"不存在该命令!"<<endl;  
                break;  
            }  
        }  
    }  
  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值