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

Description

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

–程序要求–

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

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

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

Input

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

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

顶点信息

边数

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

Output

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

图的邻接矩阵

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

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

Sample

Input

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

Output

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

AC代码

#include<iostream>
using namespace std;
//图的邻接矩阵存储及度计算
//假设图用邻接矩阵存储。输入图的顶点信息和边信息,
//完成邻接矩阵的设置,并计算各顶点的入度、出度和度,
//并输出图中的孤立点(度为0的顶点)
class Graphs{
public:
    Graphs(){}
    Graphs(char t,int n):type(t),num(n){
        matrix=new int*[n];
        for(int i=0;i<n;i++){
            matrix[i]=new int[n];
            for(int v2=0;v2<n;v2++){
                matrix[i][v2]=0;//无边相连初始化为0
            }
        }
        vname=new string[n];
        for(int i=0;i<n;i++){
            cin>>vname[i];
        }
    }
    int findvpos(string s){//找到对应顶点的位置
        for(int i=0;i<num;i++){
            if(s==vname[i]) return i;
        }
        return -1;//不存在
    }
    void CreateGraphs(){
        int edges;//边数
        cin>>edges;
        string n1,n2;
        int v1,v2;
        for(int i=0;i<edges;i++){
            cin>>n1>>n2;
            v1=findvpos(n1);
            v2=findvpos(n2);
            matrix[v1][v2]=1;//相连接
            if(type=='U'){//无向图
                matrix[v2][v1]=1;
            }
        }
    }
    void print(){//输出各顶点的度(无向图)或各顶点的出度 入度 度(有向图)
        //无向图 有向图 均输出邻接矩阵
        for(int i=0;i<num;i++){
                for(int v2=0;v2<num;v2++){
                    cout<<matrix[i][v2]<<" ";
                }
                cout<<endl;
            }
        if(type=='D'){//有向图
             for(int i=0;i<num;i++){
                int rdu=0,cdu=0;
                for(int j=0;j<num;j++){
                    rdu+=matrix[i][j];
                    cdu+=matrix[j][i];
                }
                if(rdu==0&&cdu==0) cout<<vname[i]<<endl;
                else cout<<vname[i]<<": "<<rdu<<" "<<cdu<<" "<<rdu+cdu<<endl;
            }
        }
        else if(type=='U'){//无向图
            for(int i=0;i<num;i++){
                int du=0;
                for(int j=0;j<num;j++){
                    du+=matrix[i][j];
                }
                if(du==0) cout<<vname[i]<<endl;
                else cout<<vname[i]<<": "<<du<<endl;
            }
        }
        
    }
private:
    int** matrix;//邻接矩阵
    string* vname;//顶点名字
    char type;//有向边 无向边
    int num;//顶点数
};
int main(){
    int t;
    cin>>t;
    while(t--){
        char c;//图类型
   		 int n;//顶点数
        cin>>c>>n;
        Graphs g(c,n);
        g.CreateGraphs();
        g.print();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值