图:

图中涉及的定义:

有向图:

顶点之间的相关连接具有方向性;

无向图:

顶点之间相关连接没有方向性;

完全图:

若G是无向图,则顶点数n和边数e满足:0<=e<=n(n-1)/2,当e=n(n-1)/2时,称之为完全无向图;若G是有向图,则0<=e<=n(n-1);当e=n(n-1)时,称之为完全有向图;即此时图中边数最多;

顶点的度:

无向图中定义为关联顶点的边数,有向图中分入度和出度;度D(G)和边数e满足关系:2*e=D(G),即边数的两倍等于图中度数和;

图的实现:

邻接矩阵实现图:
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<iostream>
  5. #define MAX_SIZE 10005
  6. using namespace std;
  7. int tmp[MAX_SIZE][MAX_SIZE]; //由于数组可能会比较大,定义在main里面可能会爆,所以先定义在全局;
  8. typedef struct agraph* Graph;
  9. typedef struct agraph
  10. {
  11. int n; //顶点数
  12. int e; //边数
  13. int a[MAX_SIZE][MAX_SIZE];
  14. }Agraph;
  15. Graph GraphInit(int n,Graph G) // 对图G的初始化;
  16. {
  17. G->n=n;
  18. G->e=0;
  19. return G;
  20. }
  21. void GraphAdd(int i,int j,int val,Graph G) //插入顶点之间的连接关系;
  22. {
  23. G->a[i][j]=val;G->e++;
  24. }
  25. void GraphDelete(int i,int j,Graph G) //删除顶点之间的连接关系;
  26. {
  27. G->a[i][j]=0;G->e--;
  28. }
  29. int OutDegree(int i,Graph G)
  30. {
  31. int j,sum=0;
  32. for(j=1;j<G->n;j++)
  33. {
  34. if(G->a[i][j]!=0)sum++;
  35. }
  36. return sum;
  37. }
  38. int InDegree(int i,Graph G)
  39. {
  40. int j,sum=0;
  41. for(j=1;j<=G->n;j++)
  42. {
  43. if(G->a[j][i]!=0)sum++;
  44. }
  45. return sum;
  46. }
  47. void GraphOut(Graph G)
  48. {
  49. int i,j;
  50. for(i=1;i<=G->n;i++)
  51. {
  52. for(j=1;j<=G->n;j++)
  53. printf("%3d",G->a[i][j]);
  54. printf("\n");
  55. }
  56. }
  57. int main()
  58. {
  59. int i,j,n;
  60. scanf("%d",&n);
  61. Graph G=new Agraph;
  62. G=GraphInit(n,G);
  63. GraphAdd(1,3,6,G);
  64. GraphAdd(1,5,55,G);
  65. GraphAdd(2,3,12,G);
  66. GraphAdd(2,4,50,G);
  67. GraphAdd(3,4,3,G);
  68. GraphAdd(1,2,47,G);
  69. GraphAdd(3,6,21,G);
  70. GraphAdd(3,2,31,G);
  71. GraphAdd(4,1,19,G);
  72. printf("%d %d\n",InDegree(2,G),OutDegree(2,G));
  73. printf("\n\n\n");
  74. printf("邻接矩阵中图G的关系输出:\n");
  75. GraphOut(G);
  76. return 0;
  77. }

输出截图:

邻接表实现图:
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. using namespace std;
  5. typedef struct anode* Node; //可以看成是建立一条边;
  6. typedef struct anode
  7. {
  8. int v; //边的另一个顶点;
  9. int val; //边权;
  10. Node next; //邻接表指针;
  11. }Anode;
  12. typedef struct agraph* Graph;
  13. typedef struct agraph
  14. {
  15. int n;
  16. int edges;
  17. Node *nodes;
  18. }Agraph;
  19. Node NewNext(int v,int val,Node next) //新建一个节点建立边的连接关系;
  20. {
  21. Node x=new Anode;
  22. x->v=v;
  23. x->val=val;
  24. x->next=next;
  25. return x;
  26. }
  27. Graph GraphInit(int n,Graph G) //对图G的初始化;
  28. {
  29. int i;
  30. G->n=n;
  31. G->edges=0;
  32. G->nodes=(Node*)malloc((n+1)*sizeof(Node));
  33. for(i=0;i<=n;i++)
  34. {
  35. G->nodes[i]=0;
  36. }
  37. return G;
  38. }
  39. void GraphAdd(int i,int j,int val,Graph G)
  40. {
  41. G->nodes[i]=NewNext(j,val,G->nodes[i]); //相当于i的邻接顶点不断增加时,其邻接表从表头加入,先加入的关系不断后移;
  42. G->edges++;
  43. }
  44. void GraphDelete(int i,int j,Graph G)
  45. {
  46. Node p,q;
  47. p=G->nodes[i];
  48. if(p->v==j)
  49. {
  50. G->nodes[i]=p->next;
  51. free(p);
  52. }
  53. else
  54. {
  55. while(p&&p->next->v!=j)p=p->next;
  56. if(p)
  57. {
  58. q=p->next;
  59. p->next=q->next;
  60. free(q);
  61. }
  62. }
  63. G->edges--;
  64. }
  65. int InDegree(int i,Graph G)
  66. {
  67. int j,sum=0;
  68. for(j=1;j<=G->n;j++)
  69. {
  70. /*判断当前有向图G中的边(i,j)是否存在*/
  71. Node p=G->nodes[i];
  72. while(p&&p->v!=j)p=p->next;
  73. if(p)sum++;
  74. }
  75. return sum;
  76. }
  77. int OutDegree(int i,Graph G)
  78. {
  79. Node p=G->nodes[i];
  80. int sum=0;
  81. while(p)
  82. {
  83. sum++;
  84. p=p->next;
  85. }
  86. return sum;
  87. }
  88. void GraphOut(Graph G)
  89. {
  90. Node p;
  91. int i;
  92. for(i=1;i<=G->n;i++)
  93. {
  94. if(G->nodes[i])printf("%d的邻接表:",i);
  95. p=G->nodes[i];
  96. while(p)
  97. {
  98. printf("%3d",p->v);
  99. p=p->next;
  100. }
  101. printf("\n");
  102. }
  103. }
  104. int main()
  105. {
  106. int i,j,n;
  107. scanf("%d",&n);
  108. Graph G=new Agraph;
  109. G=GraphInit(n,G);
  110. GraphAdd(1,3,6,G);
  111. GraphAdd(1,5,55,G);
  112. GraphAdd(2,3,12,G);
  113. GraphAdd(2,4,50,G);
  114. GraphAdd(3,4,3,G);
  115. GraphAdd(1,2,47,G);
  116. GraphAdd(3,6,21,G);
  117. GraphAdd(3,2,31,G);
  118. GraphAdd(4,1,19,G);
  119. printf("%d %d\n",InDegree(2,G),OutDegree(2,G));
  120. printf("\n\n\n");
  121. printf("邻接表中图G的关系图输出:\n");
  122. GraphOut(G);
  123. return 0;
  124. }

输出截图:

图的遍历:

图的遍历一般有两种方法:

1、广度优先搜索;2、深度优先搜索;

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<queue>
  6. #define MAX_SIZE 10005
  7. using namespace std;
  8. int vis[10005]={0};
  9. int cnt;
  10. int tmp[MAX_SIZE][MAX_SIZE]; //由于数组可能会比较大,定义在main里面可能会爆,所以先定义在全局;
  11. typedef struct agraph* Graph;
  12. typedef struct agraph
  13. {
  14. int n; //顶点数
  15. int e; //边数
  16. int a[MAX_SIZE][MAX_SIZE];
  17. }Agraph;
  18. Graph GraphInit(int n,Graph G) // 对图G的初始化;
  19. {
  20. G->n=n;
  21. G->e=0;
  22. return G;
  23. }
  24. void GraphAdd(int i,int j,int val,Graph G) //插入顶点之间的连接关系;
  25. {
  26. G->a[i][j]=val;G->e++;
  27. }
  28. void GraphDelete(int i,int j,Graph G) //删除顶点之间的连接关系;
  29. {
  30. G->a[i][j]=0;G->e--;
  31. }
  32. int OutDegree(int i,Graph G)
  33. {
  34. int j,sum=0;
  35. for(j=1;j<G->n;j++)
  36. {
  37. if(G->a[i][j]!=0)sum++;
  38. }
  39. return sum;
  40. }
  41. int InDegree(int i,Graph G)
  42. {
  43. int j,sum=0;
  44. for(j=1;j<=G->n;j++)
  45. {
  46. if(G->a[j][i]!=0)sum++;
  47. }
  48. return sum;
  49. }
  50. void GraphOut(Graph G)
  51. {
  52. int i,j;
  53. for(i=1;i<=G->n;i++)
  54. {
  55. for(j=1;j<=G->n;j++)
  56. printf("%3d",G->a[i][j]);
  57. printf("\n");
  58. }
  59. }
  60. /*图的遍历:广度优先搜索*/
  61. void bfs(Graph G,int i)
  62. {
  63. int j;
  64. queue<int>q;
  65. q.push(i); //从i顶点开始当前的搜索,即用顶点i初始化队列q;
  66. vis[i]=cnt++; //vis数组储存的是编号为j的这个顶点被访问时的序号;即第几个被访问到的顶点;
  67. while(!q.empty())
  68. {
  69. i=q.front();
  70. q.pop();
  71. for(j=1;j<=G->n;j++) //即对每次的i的相邻的未被访问过的顶点进行访问(符合广度优先搜索的由近到远搜索)
  72. {
  73. if((G->a[i][j])&&(vis[j]==0))
  74. {
  75. q.push(j);
  76. vis[j]=cnt++;
  77. }
  78. }
  79. }
  80. }
  81. void GraphSearchByBfs(Graph G)
  82. {
  83. int i;
  84. cnt=1;
  85. for(i=1;i<=G->n;i++)
  86. {
  87. if(vis[i]==0)
  88. bfs(G,i); //n个顶点中可能存在多个联通块,对其做一次循环之后可以保证将图中的所有的顶点都访问到;
  89. }
  90. }
  91. //上述邻接矩阵实现的图的广度优先搜索遍历因为在搜索时需要确保对所有的顶点都访问,因此所需要的时间为O(n*n);
  92. /*图的遍历:深度优先搜索*/
  93. void dfs(Graph G,int i) //邻接矩阵实现的图的深搜
  94. {
  95. int j;
  96. vis[i]=cnt++;
  97. for(j=1;j<=G->n;j++)
  98. {
  99. if(G->a[i][j])
  100. {
  101. if(vis[j]==0)dfs(G,j); //即递归走到尽头才停止这一次的搜索;
  102. }
  103. }
  104. }
  105. /*这段邻接表深搜函数函数适用的是邻接表实现的图,在此无效*/
  106. //void dfs2(Graph G,int i)
  107. //{
  108. // Node p;
  109. // vis[i]=cnt++;
  110. // for(p=G->nodes[i];p;p=p->next)
  111. // {
  112. // if(vis[p->v]==0)
  113. // dfs(G,p->v);
  114. // }
  115. //}
  116. void GraphSearchByDfs(Graph G)
  117. {
  118. int i;
  119. cnt=1;
  120. for(i=1;i<=G->n;i++)
  121. {
  122. if(vis[i]==0)
  123. dfs(G,i); //n个顶点中可能存在多个联通分支,对其做一次循环之后可以保证将图中的所有的路径都访问到;
  124. }
  125. }
  126. int main()
  127. {
  128. int i,j,n;
  129. scanf("%d",&n);
  130. Graph G=new Agraph;
  131. G=GraphInit(n,G);
  132. GraphAdd(1,3,6,G);
  133. GraphAdd(1,5,55,G);
  134. GraphAdd(2,3,12,G);
  135. GraphAdd(2,4,50,G);
  136. GraphAdd(3,4,3,G);
  137. GraphAdd(1,2,47,G);
  138. GraphAdd(3,6,21,G);
  139. GraphAdd(3,2,31,G);
  140. GraphAdd(4,1,19,G);
  141. GraphAdd(7,3,12,G);
  142. GraphAdd(2,9,1,G);
  143. GraphAdd(3,8,47,G);
  144. GraphAdd(7,9,99,G);
  145. GraphAdd(7,10,11,G);
  146. GraphAdd(9,8,23,G);
  147. printf("%d %d\n",InDegree(2,G),OutDegree(2,G));
  148. printf("\n\n\n");
  149. printf("邻接表中图G的关系图输出:\n\n");
  150. GraphOut(G);
  151. // printf("\n\n");
  152. // printf("对图进行遍历,广度优先搜索输出:\n\n");
  153. // GraphSearchByBfs(G);
  154. // for(i=1;i<=n;i++)
  155. // printf("%d是第%d个遍历到的顶点\n\n",i,vis[i]);
  156. printf("\n\n");
  157. printf("对图进行遍历,深度优先搜索输出:\n\n");
  158. GraphSearchByDfs(G);
  159. for(i=1;i<=n;i++)
  160. printf("%d是第%d个遍历到的顶点\n\n",i,vis[i]);
  161. return 0;
  162. }
1、广度优先搜索:

基本思想:从图中的某个顶点i出发,在访问了顶点i之后,接着就尽可能的先横向搜索i的邻接顶点,在一次访问过i的各个未被访问过的邻接顶点之后,分别从这些邻接顶点出发,递归以广度优先方式搜索图中的其他顶点,直至图中的所有顶点都被访问到为止;即以i为起始顶点,由近到远(即路径长度为1,2,3,.....)依次访问和顶点i有路相通的顶点;

输出结果:

2、深度优先搜索:

从i开始搜索,标记i为已访问再递归的用深度优先搜索依次搜索i的每一个未被访问的邻接顶点,如果从i出发有路可达的顶点都已被访问过,则从i开始的搜索过程结束;此时,如果图中海油未被访问的节点,则再任选一个并从该节点开始做新的搜索;直至图中所有的节点都被访问过为止;

输出结果:

图的实际问题应用:

最短路径问题:1、单源最短路径;2、所有顶点对之间的最短路径;

单源最短路径(Dijkstra算法/Bellman-Ford算法):
Dijktra(不能存在负权边):

V是赋权有向图,设置一个集合S并不断作贪心算法扩充该集合,其中的顶点当且仅当源到该顶点的最短路径已知;用dist[]数组记录当前每个顶点所对应的最短特殊路径长度(特殊路径:从源到顶点u且中间只经过S中顶点的路径称为从源到u的特殊路径)。该算法每次从V-S中取出具有最短路径长度的顶点u,将其添加到S中,同时对数组dist作必要的修改,当S中包含了V中所有顶点,dist就记录了从源到其他所有顶点的最短路径长度;

Bellman-Ford:

对图中除源顶点s外的任一顶点u,依次构造

从s到u的最短路径长度序列dist1[u],dist2[u],...,dist n-1[u].其中dist i[u]表示从s到u的最多经过i条边的最短路径长度;若G中没有从源可达的负权圈,则从s到u的最多有n-1条边;因此,dist n-1[u]就是从s到u的最短路径长度;

实现时:

用ub[]数组记录顶点的最短路径长度更细状态,count[]数组记录顶点的最短路径长度更新次数,队列que[]存储最短路径更新过的顶点,算法依次从que中取出待更新的顶点u,按照计算dist i[u]的递归式进行计算,一旦发现存在顶点k有count[k]>n,说明图G中有一个从k出发的负权圈,算法终止,否则,当队列que为空时,算法得到图G的各顶点的最短路径长度;

具体题目应用代码:后续详细复习补上;

所有顶点对之间的最短路径(floyd算法):
Dijsktra * n:

每次以一个顶点为源,重复执行Dijkstra算法n次;时间复杂度为O(n* n *n);

Floyd:

设置一个n*n的矩阵c,初始时c[i][j]=a[i][j];a是权值数组;在矩阵c上做n次迭代,经k次迭代后,c[i][j]值是从顶点i到顶点j且中间不经过编号大于k的顶点的最短路径长度。做迭代时,公式:c[i][j] = min{ a[i][j] , c[i][k]+a[k][j] };

第十一次作业:

1、(给定一个图,求图中所有顶点对之间的最短路径长度,用Floyd算法实现)


  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define INF 0x3f3f3f3f
  5. #define MAX 405
  6. using namespace std;
  7. int pre[MAX][MAX],dist[MAX][MAX];
  8. void Floyd(int n,int gra[][MAX])
  9. {
  10. int i,j,k;
  11. for(i=1;i<=n;i++)
  12. {
  13. for(j=1;j<=n;j++)
  14. {
  15. dist[i][j]=gra[i][j];pre[i][j]=j;
  16. }
  17. }
  18. for(k=1;k<=n;k++)
  19. {
  20. for(i=1;i<=n;i++)
  21. {
  22. for(j=1;j<=n;j++)
  23. {
  24. if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][k]+dist[k][j]<dist[i][j])
  25. {
  26. dist[i][j]=dist[i][k]+dist[k][j];
  27. pre[i][j]=pre[i][k];
  28. }
  29. }
  30. }
  31. }
  32. }
  33. int gra[MAX][MAX];
  34. int main()
  35. {
  36. int n,m,i,j,k;
  37. int u,v,val,tmp,que;
  38. scanf("%d%d",&n,&m);
  39. for(i=0;i<=n;i++)
  40. {
  41. for(j=0;j<=n;j++)
  42. {
  43. gra[i][j]=(i==j?0:INF);
  44. }
  45. }
  46. for(i=0;i<m;i++)
  47. {
  48. scanf("%d%d%d",&u,&v,&val);
  49. gra[u][v]=gra[v][u]=val;
  50. }
  51. Floyd(n,gra);
  52. scanf("%d",&que);
  53. for(i=0;i<que;i++)
  54. {
  55. scanf("%d%d",&u,&v);
  56. if(dist[u][v]!=INF)
  57. printf("%d\n",dist[u][v]);
  58. else printf("-1\n");
  59. }
  60. return 0;
  61. }

2、(判断图中是否存在负权圈--深搜做法:但是要会开类似三维数组vector<pair<int,int>>vv[2005];)

  1. #include<stdio.h>
  2. #include<vector>
  3. #include<memory.h>
  4. using namespace std;
  5. bool vis[2005];
  6. vector<pair<int,int> >vv[2005];
  7. int n,m,s;
  8. bool flag=false;
  9. int dis[2005];
  10. void dfs(int pos)
  11. {
  12. if(flag) return;
  13. vis[pos]=true;
  14. vector<pair<int,int> >::iterator it;
  15. for(it=vv[pos].begin();it!=vv[pos].end();it++)
  16. { int to=it->first;
  17. if(dis[to]>dis[pos]+it->second)
  18. {
  19. dis[to]=dis[pos]+it->second;
  20. if(vis[to]) {
  21. flag=true;return;}
  22. else
  23. {
  24. dfs(to);
  25. }
  26. }
  27. }
  28. }
  29. int main()
  30. {
  31. scanf("%d%d",&n,&m);
  32. int i,j;
  33. memset(vis,false,sizeof(vis));
  34. memset(dis,0,sizeof(dis));
  35. for(i=1;i<=n;i++) vv[i].clear();
  36. for(i=1;i<=m;i++)
  37. {
  38. int u,v,w;
  39. scanf("%d%d%d",&u,&v,&w);
  40. vv[u].push_back(make_pair(v,w));
  41. }
  42. scanf("%d",&s);
  43. dis[s]=0;
  44. dfs(s);
  45. if(flag) printf("EL PSY CONGROO");
  46. else printf("ttt");
  47. }

ADT图及图的实现及图的应用的更多相关文章

  1. 用rose画UML图(用例图,活动图)

    用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...

  2. 相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了!

    相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了! 先说图片X×dpi=点数dotX是图片实际尺寸,简单点,我们只算图片的高吧,比如说拍了张图片14 ...

  3. 各种图(流程图,思维导图,UML,拓扑图,ER图)简介

    来源于:http://www.cnblogs.com/jiqing9006/p/3344221.html 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有 ...

  4. UML精粹5 - 状态图,活动图,通信图,组合结构,组件图,协作,交互概述图,时间图

    状态机图state machine diagram 下面是状态图的一个例子(一个城堡中的秘密保险箱的控制面板). 转换transition包括3个部分:trigger-signature [guard ...

  5. Shader中贴图知识汇总: 漫反射贴图、凹凸贴图、高光贴图、 AO贴图、环境贴图、 光照纹理及细节贴图

    原文过于冗余,精读后做了部分简化与测试实践,原文地址:http://www.j2megame.com/html/xwzx/ty/2571.html   http://www.cnblogs.com/z ...

  6. uml的图与代码的转换——类图

    Uml是我们经常使用的统一建模语言或称标准建模语言.它的图是如何和代码对应的呢?下面我们就来就这个问题讨论一下: 首先是类:uml中的类图是这样的 在这个图中,我们可以看出,这个类图总共分了三行,第一 ...

  7. 【转】各种图(流程图,思维导图,UML,拓扑图,ER图)简介

    原文地址:各种图(流程图,思维导图,UML,拓扑图,ER图)简介 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有广泛的应用. 2.案例 3.计算机语言只 ...

  8. 点9图 Android设计中如何切图.9.png

    转载自:http://blog.csdn.net/buaaroid/article/details/51499516 本文主要介绍如何制作 切图.9.png(点9图),另一篇姊妹篇文章Android屏 ...

  9. Lodop如何设置预览后导出带背景的图,打印不带背景图

    Lodop中的ADD_PRINT_SETUP_BKIMG,可以加载上背景图,该背景图在预览的时候可以显示也可以不显示,打印可以打印出来也可以不打印出来.一般套打,都是不打印背景图的,比如一些快递的快递 ...

  10. vue 弹性布局 实现长图垂直居上,短图垂直居中

    vue 弹性布局 实现长图垂直居上,短图垂直居中 大致效果如下图,只考虑垂直方向.长图可以通过滚动条看,短图居中效果,布局合理 html代码(vue作用域内): <div class=" ...

随机推荐

  1. PTA-括号问题

    括号问题 作者: 李廷元 单位: 中国民用航空飞行学院 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB 问题描述 给定一串字符,不超过100个字符,可能包括括号.数字.字 ...

  2. Verilog中使用'include实现参数化设计

    前段时间在FPGA上用Verilog写了一个多端口以太网的数据分发模块,因为每个网口需要独立的MAC地址和IP地址,为了便于后期修改,在设计中使用parameter来定义这些地址和数据总线的位宽等常量 ...

  3. 托管代码编写mssql存储过程

    参考:http://wenku.it168.com/d_000642903.shtml 打开vs,创建数据库项目,添加新项,选择sql clr c#, 选择存储过程. 样例: [Microsoft.S ...

  4. 兼容性/pollyfill/shim/渐进增强/优雅降级

    http://ued.ctrip.com/blog/browser-compatibility-testing-tools-in-firefox-compatibility-detector.html ...

  5. 【BZOJ1047】[HAOI2007]理想的正方形

    [BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...

  6. CF97C Winning Strategy

    CF97C Winning Strategy 洛咕(题意应该快传上去了) 这题好玄学鸭...都不知道为啥是对的 设\(f[i][j]\)表示打了i轮比赛,有j个参加了一次的人,直接枚举有几个参加了转移 ...

  7. JavaScript——引用类型之数组

    前言 之前本菜打算在写完基本类型后写引用类型Object的,因为Object是引用类型的基础,其他的引用类型也是以Object为根本.只是关于对象的基本认识与简单操作确实可写的不多,打算之后与原型.原 ...

  8. Docker Manager for Docker Swarm deploy

    一.Swarm概述 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Doc ...

  9. vue-scroller实现vue单页面的上拉加载和下拉刷新问题

    在vue中如何简单的实现页面的上拉加载和下拉刷新,在这里我推荐使用vue-scrolle插件. vue-scrolle的基本使用方法: 1.下载 npm i vue-scroller -D 2.导包 ...

  10. ELK环境搭建

    ELK环境搭建 1. Virtualbox/Vagrant安装 41.1. Virtualbox安装 41.2. Vagrant安装 41.2.1. 简述 41.2.2. Vagrant box 41 ...