简单引入
存图的方法,主流的是4种。
分别是利用二维数组、构建邻接表、前向星、和链式前向星。
第一种二维数组的存图方式,优点是非常方便,只需要定义一个二维数组,就可以很快速的存图、和方便的读取。但是它的缺点也非常明显,就是容易造成空间的大量浪费。在实际解题中,一旦数据量超过一万个结点,就可以直接放弃,否则很容易爆内存。
第二种构建邻接表,空间和时间复杂度都可以接受,查找比二维数组稍慢,但是不会浪费空间。是常用的一种存图方式,但是缺点是,需要自己构建邻接表的数据结构,因此尤其对于刚学习邻接表的新手来说,不太友好,会花费一定时间在构造和查找上。
第三种前向星,用的相对不多,感兴趣的自己了解。
第四种链式前向星,跟第二种邻接表有些相似,但是存储逻辑稍有不同,特点都是不会浪费空间,时间复杂度也不高,同样需要自己构建。
实现方法
vector存图,常见的实现如下:
struct edge {int to,int value};
vector<edge> map[maxn];
maxn为节点的最大数量,to表示联通的节点,value表示权值。
在存图时,map[n][0].to、map[n][0].value就表示联通第n个节点的第一条边的节点、权值。
vector的存图优势
vector是c++ STL里的一个容器,它的继承了其它容器的共性,即空间可变,自动扩容。
因此用它存图的第一个好处就是不会浪费太多空间。
其次,vector作为c++中的容器,可以直接调用,存图时不需要自行编写代码,这一点比邻接表和链式前向星要强很多。
第三,vector是顺序结构,支持随机访问,某些题中查找速度比邻接表和前向星可能更快。
总结:c++有vector这种好东西,不用白不用。(尤其对于新手)