• 图的创建(邻接表,邻接矩阵)(浙大数据结构代码)


     邻接矩阵的定义:

    1. /**
    2. 邻接矩阵的定义:
    3. */
    4. /**
    5. #include
    6. #include
    7. using namespace std;
    8. #define MaxVertexNum 100
    9. #define INF 1e9
    10. typedef int Vertex; //vertex : 顶点
    11. typedef int WeightType;
    12. typedef char DataType;
    13. //图结点的定义:
    14. typedef struct GNode* PtrToGNode;
    15. struct GNode
    16. {
    17. int Ne; //边数
    18. int Nv; //顶点数
    19. WeightType G[MaxVertexNum][MaxVertexNum]; //邻接矩阵
    20. DataType Data[MaxVertexNum]; //存放顶点的数据
    21. };
    22. typedef PtrToGNode MGraph;
    23. //边的定义
    24. typedef struct ENode* PtrToENode;
    25. struct ENode
    26. {
    27. Vertex v1,v2;
    28. WeightType weight;
    29. };
    30. typedef PtrToENode Edge;
    31. MGraph CreateGraph(int VertexNum); //初始化一个空图(只有顶点,没有边)
    32. void InsertEdge(MGraph Graph,Edge E); //在图中插入一条边
    33. MGraph BuildGraph(); //读入顶点和边建立一个完整的图
    34. int main()
    35. {
    36. int a[3][2];
    37. fill(*a,*(a+3),5);
    38. for(int i=0;i<3;++i)
    39. for(int j=0;j<2;++j)
    40. cout << a[i][j] << endl;
    41. cout << "Hello world!" << endl;
    42. BuildGraph();
    43. return 0;
    44. }
    45. MGraph CreateGraph(int VertexNum) //初始化一个空图(只有顶点,没有边)
    46. {
    47. MGraph Graph;
    48. Graph=new GNode;
    49. Graph->Nv=VertexNum;
    50. Graph->Ne=0;
    51. for(Vertex v=0;vNv;++v)
    52. for(Vertex w=0;wNv;++w)
    53. Graph->G[v][w]=INF;
    54. return Graph;
    55. }
    56. void InsertEdge(MGraph Graph,Edge E) //在图中插入一条边
    57. {
    58. //加入一条边
    59. Graph->G[E->v1][E->v2]=E->weight;
    60. //无向图还要再加一条边
    61. Graph->G[E->v2][E->v1]=E->weight;
    62. }
    63. MGraph BuildGraph() //读入顶点和边建立一个完整的图
    64. {
    65. MGraph Graph;
    66. int Nv;
    67. Edge E;
    68. scanf("%d",&Nv);
    69. Graph=CreateGraph(Nv);
    70. scanf("%d",&Graph->Ne);
    71. if(Graph->Ne!=0)
    72. {
    73. E=new ENode;
    74. for(Vertex i=0;iNe;++i)
    75. {
    76. scanf("%d%d%d",&E->v1,&E->v2,&E->weight);
    77. InsertEdge(Graph,E);
    78. }
    79. }
    80. // 如果有顶点数据,还要读入顶点数据
    81. for(Vertex i=0;iNe;++i)
    82. scanf("%d",&Graph->Data[i]);
    83. return Graph;
    84. }
    85. */

     2)邻接表的定义:
        还是用vector 代替邻接表简便许多;

    1. /**
    2. 2)邻接表的定义:
    3. 还是用vector 代替邻接表简便许多;
    4. */
    5. #include
    6. #include
    7. using namespace std;
    8. #define MaxVertexNum 100
    9. #define INF 1e9
    10. typedef int Vertex; //vertex : 顶点
    11. typedef int WeightType;
    12. typedef char DataType;
    13. //边的定义
    14. typedef struct ENode* PtrToENode;
    15. struct ENode
    16. {
    17. Vertex v1,v2; //边的两个顶点
    18. WeightType weight; //边的权值
    19. };
    20. typedef PtrToENode Edge;
    21. //邻接点的定义:
    22. typedef struct AdjVNode* PtrToAdjVNode;
    23. struct AdjVNode
    24. {
    25. Vertex AdjV; //邻接点下标
    26. WeightType weight; //边权重
    27. PtrToAdjVNode next; //指向下一个邻接点的指针
    28. };
    29. // 顶点表头结点的定义:
    30. typedef struct VNode
    31. {
    32. PtrToAdjVNode FirstEdge; //边表头指针
    33. DataType Data; //存放顶点的数据
    34. }AdjList[MaxVertexNum];
    35. //图结点的定义:
    36. typedef struct GNode* PtrToGNode;
    37. struct GNode
    38. {
    39. int Ne; //边数
    40. int Nv; //顶点数
    41. AdjList G;
    42. };
    43. typedef PtrToGNode LGraph; //以邻接表方式存储图的类型
    44. LGraph CreateGraph(int VertexNum); //初始化一个空图(只有顶点,没有边)
    45. void InsertEdge(LGraph Graph,Edge E); //在图中插入一条边
    46. LGraph BuildGraph(); //读入顶点和边建立一个完整的图
    47. int main()
    48. {
    49. int a[3][2];
    50. fill(*a,*(a+3),5);
    51. for(int i=0;i<3;++i)
    52. for(int j=0;j<2;++j)
    53. cout << a[i][j] << endl;
    54. cout << "Hello world!" << endl;
    55. BuildGraph();
    56. return 0;
    57. }
    58. LGraph CreateGraph(int VertexNum) //初始化一个空图(只有顶点,没有边)
    59. {
    60. LGraph Graph;
    61. Graph=new GNode;
    62. Graph->Nv=VertexNum;
    63. Graph->Ne=0;
    64. for(Vertex v=0;vNv;++v) //初始化邻接表头指针
    65. Graph->G[v].FirstEdge=NULL;
    66. return Graph;
    67. }
    68. void InsertEdge(LGraph Graph,Edge E) //在图中插入一条边
    69. {
    70. //加入一条边
    71. PtrToAdjVNode NewNode;//加入一条边
    72. NewNode = new AdjVNode;
    73. NewNode->weight=E->weight;
    74. NewNode->AdjV=E->v2;
    75. NewNode->next=Graph->G[E->v1].FirstEdge;
    76. Graph->G[E->v1].FirstEdge=NewNode;
    77. //无向图还要再加一条边
    78. NewNode = new AdjVNode;
    79. NewNode->weight=E->weight;
    80. NewNode->AdjV=E->v1;
    81. NewNode->next=Graph->G[E->v2].FirstEdge;
    82. Graph->G[E->v2].FirstEdge=NewNode;
    83. }
    84. LGraph BuildGraph() //读入顶点和边建立一个完整的图
    85. {
    86. LGraph Graph;
    87. int Nv;
    88. Edge E;
    89. scanf("%d",&Nv);
    90. Graph=CreateGraph(Nv);
    91. scanf("%d",&Graph->Ne);
    92. if(Graph->Ne!=0)
    93. {
    94. E=new ENode;
    95. for(Vertex i=0;iNe;++i)
    96. {
    97. scanf("%d%d%d",&E->v1,&E->v2,&E->weight);
    98. InsertEdge(Graph,E);
    99. }
    100. }
    101. // 如果有顶点数据,还要读入顶点数据
    102. for(Vertex v=0;vNe;++v)
    103. scanf("%d",&Graph->G[v].Data);
    104. return Graph;
    105. }//加入一条边

  • 相关阅读:
    外汇天眼:使用 MT4 进行交易的最佳方式
    认识Redis以及Redis的安装
    mybatis小示例
    聊聊druid的return行为
    Web3去中心化存储生态图景
    【ESD专题】案例 :静电放电导致产品重启或死机
    ImageJ使用教程(一):开始使用
    DC-7靶机渗透测试 (GPG,drush,mkfifo,nc提权)
    个人用户实现发送短信功能
    批量制作公司出入证
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/126366337