• 【数据结构】图—图的邻接矩阵存储及度计算


    目录

    题目描述

    思路分析

    AC代码


    题目描述

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

    --程序要求--

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

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

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

    输入

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

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

    顶点信息

    边数

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

    输出

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

    图的邻接矩阵

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

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

    输入样例1 

    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

    输出样例1

    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

    思路分析

    不能用别的头文件,但是我可以用string用来存储顶点,因为char型就需要自己写一个strcmp函数,毕竟需要遍历找对应下标不是?

    在图建立的时候,数一下出度和入度,这个很简单,看代码就明白了:

                matrix[GetIndex(tail)][GetIndex(head)] = 1;
                outdegree[GetIndex(tail)]++;
                indegree[GetIndex(head)]++;

    然后如果是无向图的话,需要对称建立邻接矩阵:

                 if (kind == 'U')
                    matrix[GetIndex(head)][GetIndex(tail)] = 1;

    无向图的度就是出度和入度相加。 

    AC代码

    1. #include
    2. using namespace std;
    3. const int max_vertex_number = 100;
    4. class Map {
    5. int vertex_number = 0, edge_number = 0;
    6. int matrix[max_vertex_number][max_vertex_number] = {0};
    7. int indegree[max_vertex_number] = {0};
    8. int outdegree[max_vertex_number] = {0};
    9. string vertex[max_vertex_number];
    10. char kind;
    11. public:
    12. Map() {
    13. cin >> kind >> vertex_number;
    14. for (int i = 0; i < vertex_number; i++)
    15. cin >> vertex[i];
    16. cin >> edge_number;
    17. for (int i = 0; i < edge_number; i++) {
    18. string tail, head;
    19. cin >> tail >> head;
    20. matrix[GetIndex(tail)][GetIndex(head)] = 1;
    21. outdegree[GetIndex(tail)]++;
    22. indegree[GetIndex(head)]++;
    23. if (kind == 'U')
    24. matrix[GetIndex(head)][GetIndex(tail)] = 1;
    25. }
    26. }
    27. int GetIndex(string &data) {
    28. for (int i = 0; i < vertex_number; i++)
    29. if (data == vertex[i])
    30. return i;
    31. }
    32. void Traverse() {
    33. for (int i = 0; i < vertex_number; i++) {
    34. for (int j = 0; j < vertex_number - 1; j++)
    35. cout << matrix[i][j] << ' ';
    36. cout << matrix[i][vertex_number - 1] << endl;
    37. }
    38. for (int i = 0; i < vertex_number; i++)
    39. if (outdegree[i] + indegree[i] && kind == 'D')
    40. cout << vertex[i] << ": " << outdegree[i] << ' ' << indegree[i] << ' ' << outdegree[i] + indegree[i]<< endl;
    41. else if (outdegree[i] + indegree[i] && kind == 'U')
    42. cout << vertex[i] << ": " << outdegree[i] + indegree[i]<< endl;
    43. for (int i = 0; i < vertex_number; i++)
    44. if (outdegree[i] + indegree[i] == 0)
    45. cout << vertex[i] << endl;
    46. }
    47. };
    48. int main() {
    49. int t;
    50. cin >> t;
    51. while (t--) {
    52. Map test;
    53. test.Traverse();
    54. }
    55. return 0;
    56. }
  • 相关阅读:
    点燃那团火焰
    SCADA系统是什么意思?
    经典背包系列问题
    在Ubuntu20.04安装Kylin4 On Docker并在DataGrip配置JDBC协议连接容器内Hive1.2.1及Kylin4.0.0
    11_博客管理系统_实现过程
    最全面的创建线程的几种方式总结,让你的需求轻松选择最合适你的线程创建方式
    【webrtc】PacketBuffer的VCMPacket管理
    ThreadFactory 实例创建方式
    测试驱动开发TDD
    记ZooKeeper3.7在win下的单机部署
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/127736543