• 问题 B: 邻接表存储的图转化为邻接矩阵存储的图-附加代码模式


    题目描述

    邻接表和邻接矩阵,是两种最重要的,也是最基础的图的存储方式。同学们需要熟练掌握这两种方式的程序编写。

    以上图为例,其对应的邻接表和邻接矩阵存储方式可以分别表示为:
    (1)邻接表法
    节点个数:7
    节点信息:a b c d e f g
    a-g-f
    b-c
    c-e
    d
    e-d
    f-g-e
    g-d
    (2)邻接矩阵法
    节点个数:7
    节点信息:a b c d e f g
    0 0 0 0 0 1 1
    0 0 1 0 0 0 0
    0 0 0 0 1 0 0
    0 0 0 0 0 0 0
    0 0 0 1 0 0 0
    0 0 0 0 1 0 1
    0 1 0 1 0 0 0
    请编写程序将邻接表法存储的图,转化为邻接矩阵法存储的图,并输出

    1. // please comment the following code when you submit to OJ
    2. int main(){
    3. // freopen("/config/workspace/answer/test.in","r",stdin);
    4. linkGraph LG;
    5. Graph G;
    6. InputlinkGraph(LG);
    7. PrintlinkGraph(LG);
    8. linkGraph2Graph(LG,G);
    9. printGraph(G);
    10. DestroylinkGraph(LG);
    11. return 0;
    12. }

     本题为附加代码模式,以上代码为自动附加在同学们提交的代码后面。在本题的提示中有代码框架,请同学们拷贝后,修改,再注释掉部分代码,最后提交。

    输入格式

    输入第一行为正整数n(n<100),表示图的节点个数。
    接下来n行,表示每个节点的信息,还有以该节点为起点可以到达的其他点的边信息
    约定:每个节点信息为小写字母a开始的连续n个字母

    输出格式

    首先输出邻接表
    再输出由0,1组成的邻接矩阵

    输入样例

    1. 7
    2. a-g-f
    3. b-c
    4. c-e
    5. d
    6. e-d
    7. f-g-e
    8. g-d

    输出样例  

    1. a --> g --> f
    2. b --> c
    3. c --> e
    4. d
    5. e --> d
    6. f --> g --> e
    7. g --> d
    8. 0 0 0 0 0 1 1
    9. 0 0 1 0 0 0 0
    10. 0 0 0 0 1 0 0
    11. 0 0 0 0 0 0 0
    12. 0 0 0 1 0 0 0
    13. 0 0 0 0 1 0 1
    14. 0 0 0 1 0 0 0

    数据范围与提示

    代码框架如下(注意里面有一些小错误需要修复):

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. #define MAX_SIZE 100
    7. // 邻接矩阵存储的图
    8. struct Graph
    9. {
    10. int vexNumber;
    11. string vexInfo[MAX_SIZE];
    12. int adjMatrix[MAX_SIZE][MAX_SIZE];
    13. };
    14. // 弧结点定义
    15. struct ArcNode
    16. {
    17. int weight; // 弧上的信息部分
    18. int adj; // 邻接点的序号
    19. ArcNode *nextarc; // 下一条边
    20. };
    21. // 顶点结点定义
    22. struct VexNode
    23. {
    24. string Info; // 顶点上的信息部分
    25. ArcNode *firstarc; // 弧链头指针
    26. };
    27. // 邻接表结构的图的定义
    28. struct linkGraph
    29. {
    30. VexNode *vexes; // 每个节点的邻接表
    31. int vexnumber; // 节点数量
    32. };
    33. // 邻接表存储的图的初始化
    34. int InitGraph(linkGraph &G, int vexnumber)
    35. {
    36. G.vexes = new VexNode[vexnumber];
    37. G.vexnumber = vexnumber;
    38. for (int i = 0; i < vexnumber; i++)
    39. G.vexes[i].firstarc = NULL;
    40. return 0;
    41. }
    42. // 构造边节点指针
    43. ArcNode* getArcNode(int adj){
    44. ArcNode* node = new ArcNode();
    45. node->adj = adj;
    46. node->nextarc = nullptr;
    47. return node;
    48. }
    49. // 根据输入构造邻接表存储的图
    50. void InputlinkGraph(linkGraph& LG){
    51. }
    52. // 将邻接表存储的图转化为邻接矩阵存储的图
    53. void linkGraph2Graph(const linkGraph& LG, Graph& G){
    54. }
    55. // 输出邻接矩阵
    56. void printGraph(const Graph& G){
    57. }
    58. // 邻接表存储的图的销毁
    59. int DestroylinkGraph(linkGraph &G)
    60. {
    61. for (int i = 0; i < G.vexnumber; i++)
    62. {
    63. while (G.vexes[i].firstarc != NULL)
    64. {
    65. ArcNode *p = G.vexes[i].firstarc;
    66. G.vexes[i].firstarc = p->nextarc;
    67. delete p;
    68. }
    69. }
    70. delete[] G.vexes;
    71. G.vexes = NULL;
    72. G.vexnumber = 0;
    73. return 0;
    74. }
    75. // please comment the following code when you submit to OJ
    76. int main(){
    77. // freopen("/config/workspace/answer/test.in","r",stdin);
    78. linkGraph LG;
    79. Graph G;
    80. InputlinkGraph(LG);
    81. PrintlinkGraph(LG);
    82. linkGraph2Graph(LG,G);
    83. printGraph(G);
    84. DestroylinkGraph(LG);
    85. return 0;
    86. }

    代码展示 

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. #define MAX_SIZE 100
    7. //领接矩阵存储的图
    8. struct Graph{
    9. int vexNumber;
    10. string info[MAX_SIZE];
    11. int adjMatrix[MAX_SIZE][MAX_SIZE];
    12. };
    13. //弧结点定义
    14. struct ArcNode{
    15. int weight;//弧上的信息部分
    16. int adj;//邻接点的序号
    17. ArcNode *nextarc;
    18. };
    19. //顶点结点定义
    20. struct VexNode{
    21. char Info;
    22. ArcNode *firstarc;
    23. };
    24. //领接表结构的图的定义
    25. struct linkGraph{
    26. VexNode *vexes;
    27. int vexnumber;
    28. };
    29. int preInitGraph(linkGraph &G){
    30. G.vexes=new VexNode[G.vexnumber];
    31. for(int i=0;i
    32. G.vexes[i].firstarc=NULL;
    33. G.vexes[i].Info=(char)('a'+i);
    34. }
    35. return 0;
    36. }
    37. //构造边结点指针
    38. ArcNode * getArcNode(int adj){
    39. ArcNode* node=new ArcNode();
    40. node->adj=adj;
    41. node->nextarc=nullptr;
    42. return node;
    43. }
    44. //根据输入构造领接表存储的图
    45. void InputlinkGraph(linkGraph &LG){
    46. cin>>LG.vexnumber;
    47. preInitGraph(LG);
    48. string temp;
    49. for(int i=0;i
    50. cin>>temp;
    51. for(int j=2;jlength();j++){
    52. if(temp[j]>='a'&&temp[j]<='z'){
    53. int k;
    54. for(k=0;k
    55. if(LG.vexes[k].Info==temp[j]){
    56. break;
    57. }
    58. }
    59. ArcNode *p=getArcNode(k);
    60. ArcNode *q=LG.vexes[i].firstarc;
    61. if(LG.vexes[i].firstarc==NULL)
    62. LG.vexes[i].firstarc=p;
    63. else{
    64. while(q->nextarc!=NULL){
    65. q=q->nextarc;
    66. }
    67. q->nextarc=p;
    68. }
    69. }
    70. }
    71. }
    72. }
    73. //将领接表存储的图转化为领接矩阵存储的图
    74. void linkGraph2Graph(const linkGraph &LG,Graph &G){
    75. G.vexNumber=LG.vexnumber;
    76. G.adjMatrix[MAX_SIZE][MAX_SIZE]={0};
    77. for(int i=0;i
    78. ArcNode *p=LG.vexes[i].firstarc;
    79. while(p!=NULL){
    80. G.adjMatrix[i][p->adj]=1;
    81. p=p->nextarc;
    82. }
    83. }
    84. }
    85. //输出领接矩阵
    86. void printGraph(const Graph &G){
    87. for(int i=0;i
    88. for(int j=0;j
    89. cout<" ";
    90. }
    91. cout<
    92. }
    93. }
    94. int DestroylinkGraph(linkGraph &G){
    95. for(int i=0;i
    96. while(G.vexes[i].firstarc!=NULL){
    97. ArcNode *p=G.vexes[i].firstarc;
    98. G.vexes[i].firstarc=p->nextarc;
    99. delete p;
    100. }
    101. }
    102. delete[]G.vexes;
    103. G.vexes=NULL;
    104. G.vexnumber=0;
    105. return 0;
    106. }
    107. //输出领接表存储的图
    108. void PrintlinkGraph(const linkGraph &G){
    109. for(int i=0;i
    110. cout<
    111. ArcNode *p=G.vexes[i].firstarc;
    112. while(p!=NULL){
    113. cout<<" --> "<adj].Info;
    114. p=p->nextarc;
    115. }
    116. cout<
    117. }
    118. }
    119. //comment
    120. /*
    121. int main(){
    122. freopen("/config/workspace/test/test","r",stdin);
    123. linkGraph LG;
    124. Graph G;
    125. InputlinkGraph(LG);
    126. PrintlinkGraph(LG);
    127. linkGraph2Graph(LG,G);
    128. printGraph(G);
    129. DestroylinkGraph(LG);
    130. return 0;
    131. }
    132. */

  • 相关阅读:
    Flask Web 安装bootstrap失败pip install bootstrap
    Windows资源管理器已停止工作的两种解决方法
    D1. Balance (Easy version)(暴力&数论)
    悲惨经历:浙政钉 iPhone 手机访问页面空白,刷新后正常显示 问题排查(安卓、手机一切正常)
    人工智能的兴起和发展
    Redis的五种常用(基本)数据类型
    华为云云耀云服务器L实例评测|使用Portainer部署showdoc文档工具
    【牛客刷题】前端--JS篇(一)
    this is incompatible with sql_mode=only_full_group_by
    gin支持prometheus
  • 原文地址:https://blog.csdn.net/weixin_65908362/article/details/127874648