2023/4/16总结

图的存储

链式前向星

  1. 链式前向星和邻接表很相似,只是存储方式变成了数组。

  2. 链式前向星一般要用到一个结构体数组和一个一维数组,结构体数组edges中包括三个变量。结构体数组的大小一般由边的大小决定。

edges数组中的to代表的是某条边的终点v。w代表的是这条边的权值。next代表的是上一条和本条边同起点(u)的边的编号。

struct node
{
   int to;
   int w;
   int next;
}edges[m];

 怎样才能知道和本条边同起点的上一条边的编号呢?用一个head数组记录以每第i为起点的边的编号,实际上这里的第一条边存储的位置其实是在以i为起点的所有边的最后输入的那个编号。

3.添加边的输入:

for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&u,&v,&w);
        edges[i].to=v;
        edges[i].w=w;
        edges[i].next=head[u];
        head[u]=i;
    }

head初始化为0,i表示每条边的编号。每一次都要更新相应的head。

如果按照索引顺序,next表示下一条边的存储位置,如果按照添加顺序,next即为上一条添加的边的位置。

所以,输入顺序和存图的顺序(遍历顺序)是相反的。

4.插入的模拟过程:

2023/4/16总结_第1张图片

 5.代码如下:

#include"stdio.h"
int n,m;
struct node
{
    int to;
    int w;
    int next;
}edges[100];
int head[100];
main()
{
    int i,j,u,v,w;
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&u,&v,&w);
        edges[i].to=v;
        edges[i].w=w;
        edges[i].next=head[u];
        head[u]=i;
    }
    for(i=1;i<=n;i++)
    {
 
        for(j=head[i];j!=0;j=edges[j].next) 
        {
            printf("%d-%d=%d\n",i,edges[j].to,edges[j].w);
        }
    }
}

 

你可能感兴趣的:(算法,数据结构,动态规划)