当前位置:   article > 正文

头歌实践教学平台——数据结构_基于邻接表的新顶点的增加头歌

基于邻接表的新顶点的增加头歌

目录

一、迷宫问题

任务描述

编程要求

输入

输出

测试说明

二、基于Dijsktra算法的最短路径求解

三、六度空间理论

四、基于邻接表的新顶点的增加

五、基于邻接矩阵的新顶点的增加


一、迷宫问题

任务描述

密密被困在一个迷宫里,迷宫有n个路口,编号为1-n。密密现在站在第一个路口,出口编号为m。先给出每个路口通向何处,问密密能否逃出迷宫。

编程要求

输入

多组数据,每组数据n+2行。第一行为一个正整数n代表路口的个数,之后n行,这n行中的第i行为第i个路口的向左路口、向前路口、向右路口。最后一行为一个正整数m代表迷宫的终点。当n=0时输入结束。

输出

每组数据输出一行,若密密能走出迷宫,输出“YES”,否则输出“NO”。

测试说明

平台会对你编写的代码进行测试:

测试输入:

6

0 2 0

3 5 6

0 0 4

0 0 0

0 0 0

7 0 0

7

3

2 0 0

0 0 0

0 0 0

3

0

预期输出:

YES

NO

  1. #include <iostream>
  2. using namespace std;
  3. int m,n;//m:出口编号 n:入口
  4. int tag;//输出标记
  5. int DFS(int k,int (*a)[3])
  6. {//深度搜索第k层,k:当前路口
  7. /**************begin************/
  8. int i,j;
  9. if(k==m)//到达出口
  10. {
  11. tag=1;
  12. return 0;
  13. }
  14. for(i=0;i<3;i++)//遍历三个路口
  15. {
  16. if(0!=a[k][i]&&tag!=1)//如果当前路口有通路,并且没有走过
  17. {
  18. DFS(a[k][i],a);//进入下一个路口 ,递归
  19. }
  20. }
  21. return 0;
  22. /**************end************/
  23. }
  24. int main()
  25. {
  26. while(cin>>n)
  27. {
  28. if(n==0)break;
  29. int i,j;
  30. tag=0;
  31. int a[n+1][3];//迷宫
  32. for(i=1;i<=n;i++)
  33. for(j=0;j<3;j++)
  34. cin>> a[i][j];
  35. cin>>m;
  36. DFS(1,a);//从第一层开始搜索
  37. if(tag==1)
  38. cout<<"YES"<<endl;
  39. else if(tag==0)
  40. cout<<"NO"<<endl;
  41. }
  42. return 0;
  43. }

二、基于Dijsktra算法的最短路径求解

  1. #include <iostream>
  2. #include <cstring>
  3. #define MVNum 100
  4. #define MaxInt 999
  5. using namespace std;
  6. typedef struct
  7. {
  8. char vexs[MVNum];//点集
  9. int arcs[MVNum][MVNum];//边的邻接矩阵
  10. int vexnum,arcnum;//点数&边数
  11. }AMGraph;
  12. int LocateVex(AMGraph G,char u)
  13. {//存在则返回u在顶点表中的下标;否则返回-1
  14. int i;
  15. for(i=0;i<G.vexnum;++i)
  16. if(u==G.vexs[i])
  17. return i;
  18. return -1;
  19. }
  20. void InitAM(AMGraph &G)
  21. {//初始化图
  22. memset(G.vexs,0,sizeof(G.vexs));//初始化顶点集
  23. for(int i=0;i<MVNum;i++)
  24. for(int j=0;j<MVNum;j++)
  25. G.arcs[i][j]=MaxInt;
  26. return;
  27. }
  28. int CreateUDN(AMGraph &G)
  29. {
  30. int i,j,k;
  31. //G.vexnum++;
  32. for(i=0;i<G.vexnum;i++)
  33. cin>>G.vexs[i];
  34. for(k=0;k<G.arcnum;k++)//将边录入邻接矩阵,顺便将顶点录入
  35. {
  36. char v1,v2;int w;
  37. cin>>v1>>v2>>w;//边的端点
  38. i=LocateVex(G,v1);
  39. j=LocateVex(G,v2);
  40. G.arcs[i][j]=w;
  41. G.arcs[j][i]=G.arcs[i][j];
  42. G.arcs[i][j]=w;
  43. G.arcs[k][k]=0;
  44. }
  45. return 1;
  46. }
  47. void ShortestPath_DIJ(AMGraph G){
  48. //用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
  49. char v0,v1;
  50. int S[MVNum];
  51. int D[MVNum];
  52. int Path[MVNum];
  53. cin>>v0>>v1;
  54. int v00=LocateVex(G,v0);
  55. int n=G.vexnum; int v; //n为G中顶点的个数
  56. for( v = 0; v<n; ++v){ //n个顶点依次初始化
  57. S[v] = false; //S初始为空集
  58. D[v] = G.arcs[v00][v]; //将v0到各个终点的最短路径长度初始化
  59. if(D[v]< MaxInt) Path [v]=v00; //v0和v之间有弧,将v的前驱置为v0
  60. else Path [v]=-1; //如果v0和v之间无弧,则将v的前驱置为-1
  61. }//for
  62. S[v00]=true; //将v0加入S
  63. D[v00]=0;
  64. int w; int i; //源点到源点的距离为0
  65. /*―开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集―*/
  66. for(i=1;i<n; ++i){ //对其余n?1个顶点,依次进行计算
  67. int min= MaxInt;
  68. for(w=0;w<n; ++w)
  69. if(!S[w]&&D[w]<min)
  70. {v=w; min=D[w];} //选择一条当前的最短路径,终点为v
  71. S[v]=true; //将v加入S
  72. for(w=0;w<n; ++w) //更新从v0出发到集合V?S上所有顶点的最短路径长度
  73. if(!S[w]&&(D[v]+G.arcs[v][w]<D[w])){
  74. D[w]=D[v]+G.arcs[v][w]; //更新D[w]
  75. Path [w]=v; //更改w的前驱为v
  76. }//if
  77. }//for
  78. w=LocateVex(G,v1);
  79. cout<<D[w]<<endl;
  80. char road[G.vexnum];
  81. road[0]=G.vexs[w];
  82. int t=w;i=0;
  83. while(1)
  84. {
  85. i++;
  86. if(t==-1||t==v00)break;
  87. //cout<<G.vexs[Path[t]];//<<"#"<<Path[t]<<"#"<<Path[Path[t]]
  88. road[i]=G.vexs[Path[t]];
  89. //if(t!=-1||t!=v00)cout<<" ";
  90. t=Path[t];
  91. }
  92. while(i)
  93. {
  94. if(road[i])cout<<road[i]<<" ";
  95. i--;
  96. }
  97. cout<<road[0];
  98. cout<<endl;
  99. }//ShortestPath_DIJ
  100. void CA(AMGraph &G)
  101. {//输出矩阵
  102. int i;int j;
  103. //输出表头
  104. cout<<0<<" ";
  105. for(int i=0,j;i<G.vexnum;i++)
  106. {
  107. cout<<G.vexs[i];
  108. if(i!=G.vexnum-1)cout<<" ";
  109. }
  110. cout<<endl;
  111. for(i=0;i<G.vexnum;i++)
  112. {
  113. //输出表头
  114. cout<<G.vexs[i];
  115. if(i!=G.vexnum)cout<<" ";
  116. //输出内容
  117. for(j=0;j<G.vexnum;j++)
  118. {
  119. cout<<G.arcs[i][j];
  120. if(j!=G.vexnum-1)cout<<" ";
  121. }
  122. cout<<endl;
  123. }
  124. }
  125. int main()
  126. {
  127. while(1)
  128. {
  129. AMGraph G;
  130. InitAM(G);
  131. cin>>G.vexnum>>G.arcnum;
  132. if(G.vexnum==0&&G.arcnum==0)break;
  133. CreateUDN(G);
  134. //CA(G);
  135. ShortestPath_DIJ(G);
  136. //cout<<"--------------"<<endl;
  137. }
  138. }

三、六度空间理论

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define MAXN 10005
  5. typedef struct VNode* Vertex;
  6. struct VNode {
  7. Vertex Next;
  8. int V;
  9. };
  10. typedef struct LNode {
  11. Vertex FirstEdge;
  12. }List[MAXN];
  13. typedef struct GNode* Graph;
  14. struct GNode {
  15. int Nv,Ne;
  16. List Head;
  17. };
  18. Graph G;
  19. void Insert(int v,int w) {
  20. Vertex NewNode = (Vertex)malloc(sizeof(struct VNode));
  21. NewNode->V = v;
  22. NewNode->Next = G->Head[w].FirstEdge;
  23. G->Head[w].FirstEdge = NewNode;
  24. NewNode = (Vertex) malloc(sizeof(struct VNode));
  25. NewNode->V = w;
  26. NewNode->Next = G->Head[v].FirstEdge;
  27. G->Head[v].FirstEdge = NewNode;
  28. }
  29. int visit[MAXN];
  30. void BFS(int s) {
  31. int Q[MAXN],front = 0,rear = 0,v,i;
  32. int tail,last = s,cnt = 0,level = 0,kase = s;
  33. Vertex p;
  34. double perc;
  35. Q[++rear] = s;
  36. visit[s] = 1;
  37. cnt ++;
  38. while(rear!=front) {
  39. v = Q[++front];
  40. for(p = G->Head[v].FirstEdge;p;p = p->Next) {
  41. if(!visit[p->V]) {
  42. Q[++rear] = p->V;
  43. visit[p->V] =1;
  44. cnt ++;
  45. tail = p->V;
  46. }
  47. }
  48. if(v==last) {
  49. level ++;
  50. last = tail;
  51. }
  52. if(level == 6) break;
  53. }
  54. perc = ((double)cnt)/((double)G->Nv) * 100;
  55. printf("%d: %.2lf%%\n",kase,perc);
  56. }
  57. int main()
  58. {
  59. int i;
  60. int v,w;
  61. G = (Graph)malloc(sizeof(struct GNode));
  62. while(1){
  63. scanf("%d%d",&G->Nv,&G->Ne);
  64. if(!G->Nv||!G->Ne)
  65. return 0;
  66. for(i=1;i<=G->Nv;i++)
  67. G->Head[i].FirstEdge = NULL;
  68. for(i=1;i<=G->Ne;i++) {
  69. scanf("%d%d",&v,&w);
  70. Insert(v,w);
  71. }
  72. for(i=1;i<=G->Nv;i++) {
  73. memset(visit,0,sizeof(visit));
  74. BFS(i);
  75. }
  76. }
  77. return 0;
  78. }

四、基于邻接表的新顶点的增加

  1. #include<iostream>
  2. #define OK 1
  3. #define ERROR 0
  4. #define OVERFLOW -2
  5. #define MVNum 100
  6. using namespace std;
  7. typedef struct VNode{
  8. int data;
  9. struct VNode *next;
  10. }VNode,*NodeList;
  11. typedef struct{
  12. NodeList V[MVNum];
  13. int vexnum,arcnum;
  14. }ALGragh ;
  15. int CreateUDG(ALGragh &G,int vexnum,int arcnum){
  16. G.vexnum = vexnum;
  17. G.arcnum = arcnum;
  18. for(int i=1;i<=vexnum; i ++){
  19. G.V[i] = new VNode;
  20. G.V[i]->next = NULL;
  21. G.V[i]->data = i;
  22. }
  23. for(int i=0;i<arcnum;i++){
  24. int v1,v2;
  25. cin>>v1>>v2;
  26. NodeList p1 =new VNode;
  27. p1->data =v2;
  28. p1->next =G.V[v1]->next;
  29. G.V[v1]->next = p1;
  30. NodeList p2 =new VNode;
  31. p2->data = v1;
  32. p2->next = G.V[v2]->next;
  33. G.V[v2]->next = p2;
  34. }
  35. return OK;
  36. }
  37. int InsertVex(ALGragh &G){
  38. int data;
  39. cin>>data;
  40. G.vexnum++;
  41. G.V[G.vexnum] = new VNode;
  42. G.V[G.vexnum]->data = data;
  43. G.V[G.vexnum]->next = NULL;
  44. return OK;
  45. }
  46. int PrintGraph(ALGragh G){
  47. for(int i=1;i<=G.vexnum;i++){
  48. NodeList p =G.V[i];
  49. while(p->next){
  50. cout<<p->data<<" ";
  51. p = p->next;
  52. }
  53. cout<<p->data<<endl;
  54. }
  55. return OK;
  56. }
  57. int main()
  58. {
  59. int n,m;
  60. while(cin>>n>>m)
  61. {
  62. if(n==0&&m==0) break; //输入结束标志
  63. ALGragh G;
  64. CreateUDG(G,n,m); //采用邻接表表示法,创建无向图G
  65. InsertVex(G); //在图G中增添新顶点
  66. PrintGraph(G); //输出图G
  67. }
  68. return 0;
  69. }

五、基于邻接矩阵的新顶点的增加

  1. #include <iostream>
  2. #define MaxInt 32767
  3. #define MVNum 100
  4. #define OK 1
  5. #define ERROR -1
  6. using namespace std;
  7. typedef struct{
  8. char vexs[MVNum];
  9. int arcs[MVNum][MVNum];
  10. int vexnum,arcnum;
  11. }AMGraph;
  12. int InitAM(AMGraph &G){
  13. for(int i =0;i<MVNum; i++)
  14. G.vexs[i] = 0;
  15. for(int i =0;i<MVNum; i++)
  16. for(int j =0 ; j<MVNum;j++){
  17. G.arcs[i][j]= 0;
  18. }
  19. return OK;
  20. }
  21. int LocateVex(AMGraph G,char v){
  22. for(int i=0;i<G.vexnum;i++)
  23. if(v==G.vexs[i])
  24. return i;
  25. return ERROR;
  26. }
  27. int CreateUDN(AMGraph &G){
  28. int n;
  29. int vex = 0;
  30. for(n=0;n<G.arcnum;n++){
  31. char v1,v2;
  32. cin>>v1>>v2;
  33. int tag = 0;
  34. for(int i =0;i<G.vexnum;i++){
  35. if(v1==G.vexs[i]) tag = 1;
  36. }
  37. if(tag == 0){
  38. G.vexs[vex] = v1;
  39. vex++;
  40. }
  41. tag = 0;
  42. for(int i =0;i<G.vexnum;i++){
  43. if(v2==G.vexs[i]) tag = 1;
  44. }
  45. if(tag == 0){
  46. G.vexs[vex] = v2;
  47. vex++;
  48. }
  49. int i = LocateVex(G,v1);
  50. int j = LocateVex(G,v2);
  51. G.arcs[i][j] = 1;
  52. G.arcs[j][i] = G.arcs[i][j];
  53. }
  54. cin>>G.vexs[vex];
  55. G.vexnum++;
  56. return OK;
  57. }
  58. void PrintAM(AMGraph &G){
  59. int i,j;
  60. cout<<0<<" ";
  61. for(i=0;i<G.vexnum;i++)
  62. {
  63. cout<<G.vexs[i];
  64. if(i!=G.vexnum-1)
  65. cout<<" ";
  66. }
  67. cout<<endl;
  68. for(i=0;i<G.vexnum;i++)
  69. {
  70. cout<<G.vexs[i]; //输出表头
  71. if(i!=G.vexnum)
  72. cout<<" ";
  73. //输出内容
  74. for(j=0;j<G.vexnum;j++)
  75. {
  76. cout<<G.arcs[i][j];
  77. if(j!=G.vexnum-1)
  78. cout<<" ";
  79. }
  80. cout<<endl;
  81. }
  82. }
  83. int main()
  84. {
  85. AMGraph G;
  86. while(cin>>G.vexnum>>G.arcnum&&G.vexnum!=0&&G.arcnum!=0)
  87. { InitAM(G);
  88. CreateUDN(G);
  89. PrintAM(G);
  90. }
  91. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/737656
推荐阅读
相关标签
  

闽ICP备14008679号