链式前向星的基本构造:
~~注:本文作者初学图论大佬误喷!!!
其实本蒟蒻磕这个2天才明白,xswl
//声明解释
# to :第i条边指向哪一个节点
# next : 第i条边的下一条边序号
# cnt : 边的数量
# head[] : 第x个节点所需访问的边
//目的:向图中添加一条from(A) --> to(B)的边,边权为w
//如图:
// * ------------> *
// A B
//解:
//其实应该将图转化成链表,如图:
// * ------------> *
// A NULL
// | |
// -----> * -------
// B
void add_edge (int from , int to , int w){
//第一步:记录新边头节点B
edge[cnt].to = to ;
//第二步:记录边权值w
edge[cnt].w = w ;
//第三步:记录下一条边(如上图中NULL节点)的序号
//此步骤 = 链表中的将新节点的下一位指针指向头指针的下一位
//然而却不需要将头指针的下一位指向新节点(因为已经连好了,线性数组存储特性)
edge[cnt].next = head[from] ;
//第四步:更改下一位节点需访问的边位置
head[from] = cnt ;
//第五步:累加边数
cnt++ ;
return ;
}
简单代码(不要抄呀~~) :
#include<iostream>
#include<cstdio>
using namespace std ;
struct Edge {
int w ;
int to ;
int next ;
} edge[10005] ;
int cnt = 0 ;
int head[10005] ;
void add_edge(int from , int to , int w){
edge[cnt].to = to ;
edge[cnt].w = w ;
edge[cnt].next = head[from] ;
head[from] = cnt ;
cnt++ ;
return ;
}
int main(){
int num ;
long long start ,endd ;
cin >> num ;
for(int i = 1;i <= num;++i){
scanf("%d%d" , &start , &endd) ;
add_edge(start , endd , 1) ;
}
return 0 ;
}
假设经过下面的操作
add_edge(0,1,1) ;
add_edge(0,3,1) ;
add_edge(0,4,1) ;
add_edge(3,4,1) ;
那么此时的 edge数组、head数组 就是这样子的(这里是从0开始)
edge[i].to | 值 |
---|---|
edge[0].to | 1 |
edge[1].to | 3 |
edge[2].to | 4 |
edge[3].to | 4 |
edge[i].next | 值 |
---|---|
edge[0].next | -1 |
edge[1].next | 0 |
edge[2].next | 1 |
edge[3].next | -1 |
head[i] | 值 |
---|---|
head[0] | 0 |
head[1] | 1 |
head[2] | 2 |
head[3] | 3 |
cnt | 值 |
---|---|
cnt | 1 |
cnt | 2 |
cnt | 3 |
cnt | 4 |
此时的“链式前向星”就存在你的 edgn数组 中了!