图的基本概念
定义
图是有顶点V的集合和边E的集合组成的二元组记G=(V,E)。
无向图
顶点之间没有方向。
有向图
顶点之间的边有方向。
带权图
顶点之间的边为某种含义的数值,如两点间的距离或花费等等。
完全图
图中每两个顶点之间都存在一条边
对于无向图来讲,边的总数为n*(n-1)/2。
对于有向图来讲,边的总数为n*(n-1)。
顶点的度
图中连接该顶点的边数,对于有向图来讲,以该顶点为终点的数量为入度,以该顶点为起点的数量为出度。
邻接点
图中一条边的两个顶点,如下图中v1邻接点有v2,v4,v5。
路径、路径长度、回路
图中两个顶点之间存在一个顶点序列,则表示两个顶点之间有一条路径,路径长度指路径上的数目,回路指该路径的第一个顶点和最后一个顶点相同。如上图v1和v3有多条路径,v1->v4->v5->v1形成一条回路。
连通图
图中任意两个点都联通(存在路径),连通分量,强连通等(略)。
图的存储
图的存储相对来讲比较复杂,既要考虑构成图的顶点,又要考虑顶点之间的边的信息,常见的存储方式有邻接矩阵和邻接表。
邻接矩阵
A[ i,j ]
1(或权值):表示顶点i和顶点j有边(i和j的路程)。
0:表示顶点i和顶点j无边。
也可以用非常大(权值不会达到)的数值来表示无边,1或权值表示有变,0表示自己到自己。
邻接表
邻接表对图中的每一个顶点建立一个邻接关系的单链表,将每个但链表的表头的指针保存在一个数组中,方便随机访问任意一个顶点的链表。
下面用邻接矩阵和邻接表表示为:
邻接矩阵
邻接表
思考:图的邻接矩阵和邻接表表示的优缺点,欢迎在评论区发表自己的想法。
邻接矩阵程序实现
邻接表需要用到vector,我只会写vector的 ,参考好多人对STL不太熟练就不写了。
#include<iostream>
using namespace std;
int g[101][101];
int main(){
int i,j,n,m,a,b;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
g[a][b]=1;
g[b][a]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<g[i][j]<<" ";
}
cout<<endl;
}
return 0;
}