假期训练题好多啊,都没时间写博客了。。
(其实就是懒)
前几天jieba开了图论,好多新东西,一脸懵逼。。。
讲到链式前向星的时候还以为是星打错了,之后才具体了解。
现在会使用的图的存储方式有三种
1、邻接矩阵
对于数据不大的图,用这个方法存比较简明。开一个a【n】【n】的数组,可以记录联通情况或者权值(如果有权值的话)
2、邻接表
对于每个节点i,开一个vector用来存储以其为顶点或者起始点的边(可以是结构体,用来存权值,终点等信息)
具体代码:
vector<bian> ljb[n]; //插入边时: bian tem(b)//构造 ljb[a].push_back(tem);
3、链式前向星
struct node//这个是边的结构体
{
int to;//记录这条边的中点
int w;//权值
int next; //当前顶点所对应的下一条边
};
node bian[80010];
int head[80010];/*用来存储每个顶点的第一条边在bian数组中的位置,初始化 为-1,若head[i]==-1,说明没有以顶点i为起点的边*/
//更新前向星的函数:
int p=0;//用来记边数的全局变量
void add(int u,int v,int w)//起点为u,终点为v,权值为w
{
bian[p].to=v;
bian[p].w=w;
bian[p].next=head[u];
head[u]=p++;/*在更新时是倒着更新的,所以最后遍历的顺序是从后往前*/
}
//遍历整个图时的代码: for(int i=1;i<=n;i++) { for(int j=head[i];j!=-1;j=bian[j].next) {......} //以i为起点,以bian[j].to为终点的边 }
把自己这几天的收获写在这里,方便加深一下印象。假期一半还没过去,不能松懈啊!