美文网首页
2022-05-26 有向图

2022-05-26 有向图

作者: 晨颜 | 来源:发表于2023-06-23 15:39 被阅读0次
    //算法6.1 采用邻接矩阵表示法创建无向网
    
    #include <iostream>
    using namespace std;
    
    #define MaxInt 32767                        //表示极大值,即∞
    #define MVNum 100                           //最大顶点数
    #define OK 1    
                            
    typedef char VerTexType;                    //假设顶点的数据类型为字符型 
    typedef int ArcType;                        //假设边的权值类型为整型 
    
    //- - - - -图的邻接矩阵存储表示- - - - -
    typedef struct{ 
        VerTexType vexs[MVNum];                 //顶点表 
        ArcType arcs[MVNum][MVNum];             //邻接矩阵 
        int vexnum,arcnum;                      //图的当前点数和边数 
    }AMGraph;
    
    int LocateVex(AMGraph G , VerTexType v){
        //确定点v在G中的位置
        for(int i = 0; i < G.vexnum; ++i)
            if(G.vexs[i] == v)
                return i;
       return -1;
    }//LocateVex
    
    int CreateUDN(AMGraph &G){ 
        //采用邻接矩阵表示法,创建无向网G 
        int i , j , k;
        cout <<"请输入总顶点数,总边数,以空格隔开:";
        cin >> G.vexnum >> G.arcnum;                            //输入总顶点数,总边数
        cout << endl;
    
        cout << "输入各点的名称,如a b:" ;
    
        for(i = 0; i < G.vexnum; ++i){   
            //////////////cout << "请输入第" << (i+1) << "个点的名称:";
            cin >> G.vexs[i];                                   //依次输入点的信息 
        }
        cout << endl;
        for(i = 0; i < G.vexnum; ++i)                           //初始化邻接矩阵,边的权值均置为极大值MaxInt 
            for(j = 0; j < G.vexnum; ++j)   
                G.arcs[i][j] = MaxInt;  
        cout << "输入有向边 如从a到b,输入a b" << endl;
        for(k = 0; k < G.arcnum;++k){                           //构造邻接矩阵 
            VerTexType v1 , v2;
            ArcType w;
            //cout << "请输入第" << (k + 1) << "条边依附的顶点及权值:";
            cin >> v1 >> v2;// >> w                             //输入一条边依附的顶点及权值
            i = LocateVex(G, v1);  j = LocateVex(G, v2);        //确定v1和v2在G中的位置,即顶点数组的下标 
            G.arcs[i][j] = 1;                                   //边<v1, v2>的权值置为w 
            ////////////////////////////G.arcs[j][i] = G.arcs[i][j];                        //置<v1, v2>的对称边<v2, v1>的权值为w 
        }//for  
        return OK; 
    }//CreateUDN 
    void menu()       //显示菜单 
    {
        cout<<"----------------------\n";     
        cout<<"A.求入度\n";     
        cout<<"B.求出度\n";     
          
        cout<<"0.退出\n";      //以上为功能介绍     
        cout<<"----------------------\n";     
        fflush(stdin); 
             
    }
    int InUDN(AMGraph G,int Q) {
        int j,num=0;
        //for(Q;; ){
            for(j = 0; j < G.vexnum; ++j){
                if(G.arcs[j][Q] != MaxInt)num++;
            }
        //}
        return num; 
    }
    int OutUDN(AMGraph G,int Q) {
        int j,num=0;
            for(j = 0; j < G.vexnum; ++j){
                if(G.arcs[Q][j] != MaxInt)num++;    
            }
        return num; 
    }
    int main(){
        cout << "************算法6.1 采用邻接矩阵表示法创建有向网**************" << endl << endl;
        AMGraph G;
        int i , j;
        CreateUDN(G);
        char a;
        int b; 
        cout <<endl;
        cout << "*****邻接矩阵表示法创建的有向网*****" << endl;
        
        for(i = 0 ; i < G.vexnum ; ++i){
            for(j = 0; j < G.vexnum; ++j){
                if(j != G.vexnum - 1){
                    if(G.arcs[i][j] != MaxInt)
                        cout << G.arcs[i][j] << "\t";
                    else
                        cout << "∞" << "\t";
                }
                else{
                    if(G.arcs[i][j] != MaxInt)
                        cout << G.arcs[i][j] <<endl;
                    else
                        cout << "∞" <<endl;
                }
            }
        }
        cout <<endl;
         menu();
        while(1)
        {
            cout<<"\n请输入功能选项:";  
            cin>>a;
            while(a!='A'&&a!='a'&&a!='b'&&a!='B'&&a!='0')
                 cout<<"暂时没有此功能,请重新输入:";
                 fflush(stdin);             
                 cin>>a; 
            }  
            switch(a)
            {
                case 'A':
                  while(1){
                        cout<<"第几个点:"; cin>>b;
                        while(b<1&&b>G.vexnum )
                        {
                             cout<<"没有此点,请重新输入:";
                             fflush(stdin);             
                             cin>>b; 
                        }  
                        switch(b)
                        {
                            default:
                                 cout<<"入度为:"<<InUDN(G,b-1)<<endl<<endl;
                                break;                                   
                        }
                    }
                  break;
                 case 'B':      
                   while(1){
                        cout<<"第几个点:"; cin>>b;                                                     
                        while(b<1&&b>G.vexnum )                                     
                        {                                                           
                             cout<<"没有此点,请重新输入:";                        
                             fflush(stdin);                                         
                             cin>>b;                                                
                        }                                                           
                        switch(b)                                                   
                        {                                                      
                            default:                                                
                                 cout<<"出度为:"<<OutUDN(G,b)<<endl<<endl;                  
                                break;                                           
                        }                                                           
                /////  
                   }
                   break;                                                
                default:
                    return 0;
                
            
            }
        }
        return 0;
    }//main

    相关文章

      网友评论

          本文标题:2022-05-26 有向图

          本文链接:https://www.haomeiwen.com/subject/uzhpprtx.html