链式向前星(数组模拟邻接表)

   有关树的经常需要存图,vector数组比较方便,不过有些题卡stl,就很容易T。所以链式向前星就非常重要了。

   这几天能不用链式向前星就不用,因为不会用...这当然是不可取的。想起来初中老班的一句话,出来混迟早是要还的,所以问题不解决迟早是要栽坑的。昨天遇见dfs序时不太会模拟,因为对出栈的点的顺序理解的不是很通透,全套板子。一步一步稳着来,zkw冲呀

 

含义: 

      链式向前星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并用head[ ]记录下以某个点为起点的所有边在数组中的起始位置。换句话来理解它其实就是有n链表,每条链表存的是所有相同结点的边

       edge[i].to:第i条边的终点,即这条边指向哪个点      

       edge[i].nxt:与i同起点的下一条边的存储位置

       edge[i].val:边权

       head[i]:以第i为初始结点的边的序号,其实在以i为起点的所有边的最后输入的那个编号   

理解:

   链式向前星(数组模拟邻接表)_第1张图片

用图表示:

    链式向前星(数组模拟邻接表)_第2张图片

 

 板子:

int head[maxn];  //记得初始化为-1
int cnt = 0;
struct node {
    int to;
    int nxt;
    int val;
}edge[maxn];   //若建立双向边的话,maxn需要*2

void add(int a,int b,int val) {
    edge[cnt].to = b; 
    edge[cnt].nxt = head[a];
    edge[cnt].val = val;
    head[a] = cnt++;
}

//遍历起点为x的链表
for(int i = head[x]; i!=-1; i=node[i].nxt) {
    
}

 

你可能感兴趣的:(图的存储)