基础概念
连通分量(connected component,CC):结点相互可达。 O ( N + M ) O(N+M) O(N+M)可以求出任意无向图的CC。
二分图/二部图(bipartite graph):节点由两个集合组成,且两个集合内部没有边的图。
强连通(strongly connected): 在一个有向图G里,设两个点 a,b,由a有一条路可以走到b,由b又有一条路可以走到a,我们就叫这两个顶点(a,b)强连通。
强连通图: 如果在一个有向图G中,每两个点都强连通,我们就叫这个图,强连通图。
强连通分量(strongly connected components):在一个有向图G中,有一个子图,这个子图每2个点都满足强连通,我们就叫这个子图叫做 强连通分量。
割点:一个结点称为割点(或者割顶)当且仅当去掉该节点极其相关的边之后的子图不连通。
桥:一条边称为桥(或者割边)当且仅当去掉该边之后的子图不连通。
匹配:匹配是指无向图的边集的一个子集,使得这个子集中的任意两条边没有公共顶点且不包含自环。其中边数最多的匹配称为最大匹配。
顶点覆盖:顶点覆盖是指无向图的点集的一个子集,使得边集中的任意一条边都至少有一个端点在这个子集中。
基础操作
图的存储
掌握好图的存储方式:链式前向星
链式前向星-数据结构:基于边的五个数据结构
int head[10004],to[20004],w[20004],ne[20004],idx;
//head[]的大小随结点的数量;
//to[],w[],nxt[]的大小随边的数量(特别要注意!如果你双向存储边的话,to[],w[],nxt[]的大小应至少是边的数量*2)
链式前向星-加边函数:
inline void addedge(int x,int y,int z) //添加一条x-->y,权值为z的边
{
w[++idx]=z; // 必须++idx
to[idx]=y;
ne[idx]=head[x];
head[x]=idx;
}