一、图的基本概念
一个图是由点集V和边集E组成的,一般记做图G=<V,E>,一条边连接两个顶点。
无向图:全部由无向边构成的图。
有向图:由有向边构成的图。
自环:边连接的两个点是同一个点。
重边:无向图中指两点之间有多条边连接,有向图中指两点之间有多条同方向的边连接。
孤点:没有连接边的点。
简单图:没有自环和重边的图。
无向图的度数:对于顶点v,v作为边的端点的次数称为v的度数,记为d(v)。
有向图的度数:对于顶点v,v作为边的起点的次数称为v的出度,记为 d + ( v ) d^+(v) d+(v);v作为边的终点的次数称为v的入度,记为 d − ( v ) d^-(v) d−(v);顶点v的度数 d ( v ) = d + ( v ) + d − ( v ) d(v)=d^+(v)+d^-(v) d(v)=d+(v)+d−(v)
每个图G的最大度为所有顶点度数的最大值,记作Δ(G),最小度为所有顶点度数的最小值,记作δ(G)。
一张图G所有点的度数和为边数的两倍。
有向图出度和等于入度和。
二、完全图和竞赛图
无向完全图:设G为一个有n个节点的无向简单图,若G中每个顶点都与其他n-1个顶点有边相连,则称G为n阶无向完全图(n阶完全图),记作 K n K_n Kn
有向完全图:设G为一个有n个节点的有向简单图,若G中每个顶点都有连到其他n-1个顶点的边,且都有这些节点连向它的边,则称G为n阶有向完全图。
竞赛图:基于n阶无向完全图,给每条边任意确定一个方向形成的图称为n阶竞赛图。
三、同构
设G和G’是分别具有顶点集V和V’的两个图。如果存在一个双射h:V→V’,满足当且仅当 ( v i , v j ) (v_i,v_j) (vi,vj)是G的边时, ( h ( v i ) , h ( v j ) ) (h(v_i),h(v_j)) (h(vi),h(vj))是G’的边,则称图G和G’同构。
四、通路、回路、路径、距离
对于一个图G,G中顶点与边的交替序列 v 0 e 1 v 1 e 2 v 2 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ e n v n v_0e_1v_1e_2v_2······e_nv_n v0e1v1e2v2⋅⋅⋅⋅⋅⋅envn称为 v 0 v_0 v0到 v n v_n vn的通路,其中 v 0 v_0 v0, v n v_n vn称为通路的起点和终点,通路中边的条数称为它的长度。
对于一条通路,如果 v 0 = v n v_0=v_n v0=vn则称为回路,如果 v 0 = v n v_0=v_n v0=vn且其他所有顶点都不相同,则称为环。
如果通路的所有的边都不相同,称为迹。如果通路中的所有顶点都不相同,称为路径。
图中连接两点之间最短的路径长度称为距离。
五、连通性与连通块
连通性:设图G=<V,E>,u,v属于V,如果u,v之间相互可达,则称u,v是连通的。对于任意一个点v,v和v自己是连通的。
连通图:对于任意非空无向图G,若,若G中任意两个顶点都是连通的,则称G为连通图。
连通块:对于无向图G的一个连通子图H,如果H是一个极大连通子图(任意加一个点或者一条边后不是连通子图),则称H是G的一个连通块(连通分量)。
强连通:如果有向图G中的顶点两两可达,则称G为强连通图。
强连通块:对于有向图G的一个强连通子图H,如果H是一个极大强连通子图(任意加一个点或者一条边后不是强连通子图),则称H是G的一个强连通块(强连通分量)。
六、图的存储
①邻接矩阵
//a->b的边,边权为c
g[a][b]=c;
②邻接表
邻接表是由多个单链表组合而成的
// 用数组模拟
int h[N], w[N], e[N], ne[N], idx;
// 添加一条边a->b,边权为c
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
// 初始化
idx = 0;
memset(h, -1, sizeof h);
typedef pair<int, int> PII;
vector<PII> edge[N];
// 添加一条边a->b,边权为c
void add(int a, int b, int c)
{
edge[a].push_back({b,c});
}