链式前向星法存储图和遍历方法

可以图中联通的多个点当做一条条的“链”,这些边则是把这些点“串联”在一起(即存在类似树种的父子节点关系,若题目无特殊指明为有向图,故默认为无向图,因为一条边中的两个节点都可能是父节点或子节点,故需要正反两次建边进行链式存储)

定义struct Edge{int to,next;}edge[n*2+1]; 定义结构体Edge和Edge结构体数组edge,其中to表示edge数组的当前下标i表示的父节点i指向的子节点to,而next表示在edge数组中,以前点i为父节点的前一条边的下标,故可以通过i=edge[i].next的方法,就可以把当前父节点i转移到子节点to

定义一个int head[n+1],head数组故名头,假设head数组的某下标为i,则i表示以点i为父节点的最后一条边的下标,找到该下标就可以通过数组edge的next下标找到以i为父节点的上一条边。

定义一个int cnt=0;每次添加一条边时都提前进行cnt++;表示在数组edge种多一条边,且更新当前父节点i最新在edge数组的下标
具体代码实现如下:

struct Edge{
	int to;
	int next;
	//int w; //有时候题目说明边有权值时可以添加一个变量w
}edge[MAX<<1];
int head[MAX + 5], cnt;

//头,链式前向星存图,点head[x]表示点x所在边在edge数组出现最后一次的下标

void edge_add(int u, int v) { //添加由点u指向点v的边
    edge[++cnt].to = v;
    edge[cnt].next = head[u];
    head[u] = cnt;
}

在这里插入图片描述

在这里插入图片描述
对图的遍历

void dfs(int now){
	//具体操作 
	for(int i=head[now];i!=0;i=edge[i].next){
		//具体操作 
		dfs(edge[i].to);
	}
} 

之前做题的时候没有总结,蹭着做课设时不想用指针做链表存储而重新滤了一遍就匆忙写了下想法,上述表格我没检查,有可能不对的,希望大家原谅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值