只是一个鶸用来记录学习内容的文章罢了,如果能多少帮到你那真是太好了,发现错误欢迎指正。
vector建图是利用vector数组长度可变的特点来建立邻接表以存储图结构。
vector建图
初始化
vector<int> g[n];//n为顶点数
初始化一个一维数组g,g里面的每个元素都是一个vector数组。
画在图上大概是这个样子。
因为vector数组的长度是可以动态扩容的,所以通常情况下建立稀疏图的时候可以比邻接矩阵节省一些空间,同时相比用数组加链表建图又更加易于操作。比如洛谷P5318需要排序,只需要用sort对g中的每个vector数组排序就好,如果是数组加链表不见得能更简单。
建图
建图和普通的邻接表差不多。我们计划让g[a]的vector数组里存放a能直接到达的点b1,b2,b3…
比如下图
用vector建图完之后就是这样
所以,当知道一条边的起点和终点之后,只要将终点插在起点所在的vector数组的末尾就好了。当所有边都按此法输入后图就建立完成了。
while(m--){
//m为边数
scanf("%d%d",&a,&b);//a--->b
g[a].push_back(b);//将终点插在起点所在的vector数组的末尾
}
基于vector建图的深搜和广搜
最后附上vector建图的深搜广搜代码供参考,同时也是P5318的AC代码,深搜广搜不是本文的重点就不细说了。
#include <bits/stdc++.h>
using namespace std;
int flag1=0,flag2=0;
void dfs(vector<int>* g,int n,int i