图论——图的构造:那些难倒你的 “ 链式前向星 ”

链式前向星的基本构造:

~~注:本文作者初学图论大佬误喷!!!
其实本蒟蒻磕这个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].to1
edge[1].to3
edge[2].to4
edge[3].to4
edge[i].next
edge[0].next-1
edge[1].next0
edge[2].next1
edge[3].next-1
head[i]
head[0]0
head[1]1
head[2]2
head[3]3
cnt
cnt1
cnt2
cnt3
cnt4

此时的“链式前向星”就存在你的 edgn数组 中了!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值