有向图,无向图
通常用邻接矩阵存,也可以拓展为存权值,无向图是对称矩阵
简单好写,查找速度快,但空间复杂度太高
于是引出邻接表
struct Edge
{
int to, w;
};
由于只关注从该点起,能连接到哪个点,所以邻接表中的节点顺序无意义
STL里的vector容器,作为动态数组,既拥有链表节省内存的优点,但又可以以类似数组的方式访问,而且写法也很简便。
std::vector<Edge> edges[MAXN];
inline void add(int from, int to, int w)
{
Edge e = {to, w};
edges[from].push_back(e); //向vector的最后添加一条边
}
链式前向星:通俗上来说,用数组模拟链表,其常数更大,但是写法更为复杂
struct Edge
{
int to, w, next;
}edges[MAXM];
int head[MAXN], cnt; // cnt为当前边的编号
inline void add(int from, int to, int w)
{
edges[++cnt].w = w; //新增一条编号为cnt+1的边,边权为w
edges[cnt].to = to; //该边的终点为to
edges[cnt].next = head[from]; //把下一条边,设置为当前起点的第一条边
head[from] = cnt; //该边成为当前起点新的第一条边
}
我们为每条边额外储存一个属性next,并赋予每条边一个编号。head数组则用于储存每个起点对应的第一条边。
存图过程: