DS图—图的邻接矩阵存储及度计算

题目描述

假设图用邻接矩阵存储。输入图的顶点信息和边信息,完成邻接矩阵的设置,并计算各顶点的入度、出度和度,并输出图中的孤立点(度为0的顶点)

--程序要求--

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio

程序中若include多过一个头文件,不看代码,作0分处理

不允许使用第三方对象或函数实现本题的要求

输入

测试次数T,每组测试数据格式如下:

图类型  顶点数 (D—有向图,U—无向图)

顶点信息

边数

每行一条边(顶点1 顶点2)或弧(弧尾 弧头)信息

输出

每组测试数据输出如下信息(具体输出格式见样例):

图的邻接矩阵

按顶点信息输出各顶点的度(无向图)或各顶点的出度  入度  度(有向图)。孤立点的度信息不输出。

图的孤立点。若没有孤立点,不输出任何信息。

样例输入

2

D 5

V1 V2 V3 V4 V5

7

V1 V2

V1 V4

V2 V3

V3 V1

V3 V5

V4 V3

V4 V5

U 5

A B C D E

5

A B

A C

B D

D C

A D

样例输出

0 1 0 1 0

0 0 1 0 0

1 0 0 0 1

0 0 1 0 1

0 0 0 0 0

V1: 2 1 3

V2: 1 1 2

V3: 2 2 4

V4: 2 1 3

V5: 0 2 2

0 1 1 1 0

1 0 0 1 0

1 0 0 1 0

1 1 1 0 0

0 0 0 0 0

A: 3

B: 2

C: 2

D: 3

E

#include<iostream>
#include<cstring>
using namespace std;
 
int find(string str[], string st, int n){
    for(int i= 0; i< n; i++)
      if(str[i]== st)
       return i;
}
int main(){
    int t;
    cin>>t;
     
    while(t--){
        string ch;
        int n;
        cin>>ch>>n;
         
        string str[200];
        for(int i= 0; i< n; i++)
           cin>>str[i];
            
 
        int array[n+ 5][n+5];
         
        for(int i= 0; i< n+ 5; i++)
          for(int j= 0 ; j< n+ 5; j++)
            array[i][j]= 0;
             
        int in;
        cin>>in;
         
        for(int i= 0 ; i< in; i++){
            string s1; 
            string s2;
            cin>>s1>>s2;
             
            int a= find(str, s1, n);
            int b= find(str, s2, n);
            //cout<<a<<" "<<b<<"_____"<<endl;
            array[a][b]= 1;
            if(ch== "U")
            array[b][a]= 1;
        }
         
        for(int i= 0; i< n; i++){
          for(int j= 0; j< n; j++){
            cout<<array[i][j];    
            if(j!= n- 1)
             cout<<" ";       
          }
 
            cout<<endl;
        }
         
 
        for(int i= 0; i< n; i++){
            cout<<str[i];
             int inn= 0;
             int outt= 0;
                         
            for(int j= 0; j< n; j++){
                if(array[i][j])
                  outt++;
            }
            for(int j= 0; j< n; j++){
                if(array[j][i])
                  inn++;
            }
             
            if(ch== "U"){
                if(inn+ outt){
                    cout<<": "<<(inn+outt)/ 2<<endl;
                }
                 
            }
            else if(ch== "D"){
                if(inn+ outt)
                cout<<": "<<outt<<" "<<inn<<" "<<inn+ outt<<endl;
            }
        }
 
    }
     
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/83821763