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

题目描述

假设图用邻接矩阵存储。输入图的顶点信息和边信息,完成邻接矩阵的设置,并计算各顶点的入度、出度和度,并输出图中的孤立点(度为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 <string>
using namespace std;

void output(char symbol,int **m,string *s,int n)
{
    int sum=0;
    if(symbol=='U')
    {
        for(int i=0;i<n;i++)
        {
            sum=0;
            cout<<s[i];
            for(int j=0;j<n;j++)
            {
                if(m[i][j]!=0)
                    sum++;
            }
            if(sum!=0)
                cout<<':'<<' '<<sum;
            cout<<endl;
        }
    }
    else
    {
        int sum1;
        for(int i=0;i<n;i++)
        {
            sum=0;
            sum1=0;
            cout<<s[i];
            for(int j=0;j<n;j++)
            {
                if(m[i][j]!=0)
                    sum++;
            }
            for(int j=0;j<n;j++)
            {
                if(m[j][i]!=0)
                    sum1++;
            }
            if(sum==0&&sum1==0)
                cout<<endl;
            else
            {
                cout<<':'<<' '<<sum;
                cout<<' '<<sum1<<' '<<sum+sum1;
                cout<<endl;
            }
        }
    }
}
void test()
{
    char symbol;
    cin>>symbol;
    int n,k;
    cin>>n;
    string *s=new string[n];
    for(int i=0;i<n;i++)
        cin>>s[i];
    int **m;
    m=new int*[n];
    for(int i=0;i<n;i++)
    {
        m[i]=new int[n];
        for(int j=0;j<n;j++)
            m[i][j]=0;
    }
    cin>>k;
    string temp1,temp2;
    int flag1,flag2;
    for(int i=0;i<k;i++)
    {
        cin>>temp1>>temp2;
        for(int p=0;p<n;p++)
        {
            if(s[p]==temp1)
                flag1=p;
            if(s[p]==temp2)
                flag2=p;
        }
        m[flag1][flag2]=1;
        if(symbol=='U')
            m[flag2][flag1]=1;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(j==n-1)
                cout<<m[i][j];
            else
            cout<<m[i][j]<<' ';
        }
        cout<<endl;
    }
    output(symbol,m,s,n);
}
int main()
{
    int t;
    cin>>t;
    while(t--)
        test();
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值