基本概念
什么是图?
图是一种数据结构,它的概念很容易理解:点用边连接起来就是图
关于图的定义与概念
有向图
图上的边有方向,只能从一点到另一点。如下图,只能由点C直接到点A,而不能从点A到点C
相关概念
结点的入度:在有向图中,以此结点为终点的边的数量
结点的出度:在有向图中,以此结点为起点的边的数量
无向图
图上的边没有方向,可以双向到达
相关概念
结点的度:在无向图中,与此结点相连的边的数量
通用概念
权值:边的“代价”/“费用”,可以理解为路费或油耗
连通:如果图中两个结点之间有一条从其中一点通过若干条边、点到达另一个点的通路,则称这两个点连通
回路:起点与终点为同一个点的路径,称作回路或“环”
完全图:每个点之间都能直接到达的图
注:一个拥有n个结点的完全无向图有 n * (n-1)/2 条边,一个拥有n个结点的完全有向图则有 n * (n-1)条边
稠密图:一个边数接近完全图的图
稀疏图:一个边数远远少于完全图的图
强联通分量:在有向图中,任意两点都连通的最大子图,单个点也算强联通分量!
图的存储
邻接矩阵存储
定义:有权图中,G[i][j]表示从点i到点j的边的权值,如果无边即为∞;无权图即表示为1和0
如图:
转换为图就是:
代码实现:
#include<bits/stdc++.h>
using namespace std;
int matrix[1024][1024],n;
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&matrix[i][j]);
return 0;
}
邻接表存储
图的一种链式存储方法,一般用数组模拟,而不是直接用链表
代码实现:
#include<bits/stdc++.h>
using namespace std;
int head[1024],nxt[2048],to[2048],tot=0;//无向图需要存边的数组开两倍的内存
void add_edge(int u,int v)
{
nxt[++tot]=head[u];
to[tot]=v;
head[u]=tot;
}
int main()
{
int n,m,i,u,v;
scanf("%d %d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
add_edge(u,v);
add_edge(v,u);//无向图双向建边
}
return 0;
}
注:部分图片来源于网络,如侵权可评论/私信提醒