搜索与图论-图的储存方式

文章介绍了图的几种常见存储结构,包括邻接矩阵(有向和无向),用于存储顶点间的关系;数组存边的方式,存储边的起点、终点和权值;邻接表,表示每个顶点相邻的边集;以及链式前向星,适用于大量顶点和边的情况,按起点排序存储边。
摘要由CSDN通过智能技术生成

1,邻接矩阵

逻辑结构分为两部分:V和E集合,其中,V是顶点,E是边。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵

创建一个二维数组v[5]\[5],将点作为下标,数组值代表这条边的权值,a=1,b=2,c=3,d=4,由图可知v[1]\[2]=3

                                                                                                         

2,数组存边

```c++
struct Edge
{
    int value;//边的权
    int to;//边的终点
    int from;//边的起点
} edge[500005];
//存边
    for (int i = 0; i < m; i++)
    {
        cin >> u >> v >> w;
        edge[i].from = u;
        edge[i].to = v;
        edge[i].value = w;
    }
```

3,邻接表

邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集。

如果是无向图,那么每条边由两个结点组成,分别代表边的两个端点;如果是有向图,那么每条边是一个结点对,分别代表边的始点和终点。

```c++
vector<int> a[500005];
//存边
for(int i=0;i<m;i++){
    cin >> u >>v;//u点与v点是连通的
    a[u].push_back(v);
    //a[i]存的为与i点相连的点,但一般不存边权
}
//遍历
for(int i=1;i<=n;i++)//遍历起点
{
    for(int j=0;j<a[i].size();j++)//遍历和i相连的点
    {
        cout << "起点:"<< i<<" 终点:"<< a[i][j] <<'\n';
    }
}
```

4,链式前向星

一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。

```c++
struct Edge
{
    int next;//下个同起点的边的在edge数组里的下标
    int value;//当前边的边权
    int to;//这条边的终点
} edge[500005];
int first_edge[500005];//first_edge[i]存的是以i为起点的第一个边在edge数组里的下标
//存边
void add(int u, int v, int val, int i)
{
    edge[i].to = v;//记录这条边的终点
    edge[i].value = val;//边权
    edge[i].next = first_edge[u];//下条同起点的边的下标为原先的第一条边的下标
    first_edge[u] = i;//新的第一条边更新
}
//遍历
for(int j=1;j<=n;j++)//遍历所有起点[1,n]
{
    for (int i = first_edge[j]; i != 0; i = edge[i].next)//遍历起点为j的所有边
    {
        cout << " 起点:"<<j<<" 终点:"<<edge[i].to<< " 边权:"<<edge[i].value<< '\n';
    }
}

```

  题目:

       【深基18.例3】查找文献 - 洛谷

        图的遍历 - 洛谷          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值