图:邻接表和邻接矩阵的模板代码

邻接表和邻接矩阵的模板代码
一、邻接矩阵:
    一般适用于有向图,有n个结点就构建一个动态数组vector<int>linjie[n],本质是一个二维数组。构建过程:如果a连着b c d,就:linjie[a].push_back(b),linjie[a].push_back(c),linjie[a].push_back(c).那么linjie[a].size()就是a连的结点的个数linjie[a][i]就是a连的第i个结点。
vector<int>linjie[n];//n个结点
int a,b;
//存储
for(int i=1;i<=m;++i)//m条边
{
    cin>>a>>b;
    linjie[a].push_back(b);
}
//遍历第x个结点邻接的结点
int x,
for(int i=0;i<linjie[x].size();++i)
{
    cout<<linjie[x][i];//就是邻接的结点
}

二、邻接表

    一般用于无向图,从任意一个点开始dfs都可以遍历到整个图所有的点,一共有n个结点,n-1个边,此时我们需要构建head[n]、nex[2*maxn]、to[2*maxn]、index.如果边有权值还需要构建val[2*maxn]数组。他的本质就是把每条边都作为一组邻接关系,用index来表示第几组。我们认为每条边都是存在方向的,比如a--b 那个a->b b->a 可以认为是双向边。head[a]记录的就是以a为根,连接别的结点的最后一条边的index ,to[i]就代表第i组被连接的结点,nex[i]存储的就是第i组数据时,他的头结点是a 那么nex[i]存的就是此时的head[a],这样就可以根据这一组边 找到上一组同时以a为起点的边了 注意此时要更新head[a]为刚存的这一组,这样最后遍历某一个结点a的邻接关系时,就可以从head[a]开始找到组数一直递推到第一组,遍历所有邻接关系。

int head[maxn], to[2 * maxn], nex[2 * maxn], val[2 * maxn], index;//邻接表
//邻接函数
void add(int a, int b, int c)
{
    index++;
    val[index] = c;
    to[index] = b;
    nex[index] = head[a];
    head[a] = index;
}

//输入邻接关系
 for (int i = 1; i < n; ++i)
    {
        cin >> a >> b >> c;
        add(a, b, c);
        add(b, a, c);//注意是双向的
    }

memset(head, -1, sizeof(head));//初始化邻接表的head数组为-1,这样遍历的时候就有边界返回条件
//遍历邻接关系
for (int i = head[u]; i != -1; i = nex[i])
    {
        int j = to[i];
    }

 

posted @ 2022-04-27 09:58  朱朱成  阅读(255)  评论(0编辑  收藏  举报