目录

一、链式前向星存图

二、两种遍历方法


一、链式前向星存图:(n个点,n-1条边)

链式前向星把上面的树图存下来,输入:

9 ///代表要存进去n个点
1 2 ///下面是n-1条边,每条边连接两个点
1 3
1 7
2 4
4 5
4 6
3 8
3 9

1、先把链式前向星想成链表,建成后(存双向边):

(数字代表竖线前的点与后面的点相连,1-2、1-3 都是表示边。 注意:链表并不是只建立一条,而是对每个点都建且只建一个)

2、因为链表的建立或者是插入都不是特别简单,直接用链表不太可行,链式前向星就是用数组模拟的链表(就像队列、单调栈都是用数组模拟的,比较简单)。

链表包含head指针和data,因此用数组head[]代替指针,用结构体edge[]代替data存放数据。

a.建立结构体edge[]:

struct node{
int to; ///相连的的点的id
int next; ///指针(说指针可能听不懂,看完就知道了)
}edge[MAX+5];

b.为了便于链表的遍历,要给数组head[]赋初值-1:

void init()
{
memset(head,-1,sizeof(head));
ans=0; ///ans表示总共n-1条边,现在建到第ans条边了。
}

 3、模拟链表的建立和插入:

往链表中存进去一条边,若原来没有这个点的链表那就要新建一条边,不然就是往已有的链表中插入一条边。

a.新建一条链表:

例如要建1-2这条边:(因为前面没建立点1的链表,所以要新建一个链表)

1)、将数据存入结构体edge中:

2)):将指针指向这个链表:

所以如果想知道1这个点的链表存了什么内容,结构体 edge[head[1]] 中存的就是,所以前面说head[]是个指针。

2、往已经存在的链表中插入一条边:

例如要建1-3这条边:(因为前面建立了点1的链表,所以要把这个边插进去)

1)、把数据存入结构体edge中:

2)、指针指向该链表块:

这样就把链表建好了!!!

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAX=2e5;
struct node{
LL to;
LL next;
}edge[MAX+5];
LL n,ans;
LL head[MAX+5];
void addedge(LL u,LL v)
{
edge[ans].to=v;
edge[ans].next=head[u];
head[u]=ans++;
}
void init()
{
memset(head,-1,sizeof(head));
ans=0;
} int main()
{
init(); ///链式前向星存图千万不要忘记先把数组head初始化
cin>>n;
for(LL i=0;i<n-1;i++){
LL u,v;
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
return 0;
}

二、两种遍历方法:

感谢:布衣书生real

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAX=2e5;
struct node{ ///下面是链式前向星存图
LL to;
LL next;
}edge[MAX+5];
LL n,ans;
LL head[MAX+5];
void addedge(LL u,LL v)
{
edge[ans].to=v;
edge[ans].next=head[u];
head[u]=ans++;
}
void init()
{
memset(head,-1,sizeof(head));
ans=0;
}
LL cnt;
LL num[MAX+5];
bool vis[MAX+5];
void dfs(int u) ///递归实现深度优先搜索
{
printf("%d ",u);
vis[u]=true;
for(int i=head[u];~i;i=edge[i].next){
int to=edge[i].to;
if(!vis[to]){
dfs(to);
}
}
} void bfs(int u) ///队列实现广度优先搜索
{
queue<int>q;
vis[u]=true;
q.push(u);
while(!q.empty()){
int k=q.front();
q.pop();
printf("%d ",k);
for(int i=head[k];~i;i=edge[i].next){
int to=edge[i].to;
if(!vis[to]){
q.push(to);
vis[to]=true; ///因为不是递归实现,所以每次放入队列后都需要立即标记。
}
}
}
} int main()
{
init();
cin>>n;
for(LL i=0;i<n-1;i++){
LL u,v;
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
cout<<"dfs:"<<endl;
dfs(1);
memset(vis,false,sizeof(vis));
cout<<endl<<"bfs:"<<endl;
bfs(1);
printf("\n");
cout<<endl;
return 0;
}

链式前向星存树图和遍历它的两种方法【dfs、bfs】的更多相关文章

  1. 最短路 spfa 算法 && 链式前向星存图

    推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...

  2. Pants On Fire(链式前向星存图、dfs)

    Pants On Fire 传送门:链接  来源:upc9653 题目描述 Donald and Mike are the leaders of the free world and haven't ...

  3. C++算法 链式前向星存图

    这个东西恶心了我一阵子,那个什么是什么的上一个一直是背下来的,上次比赛忘了,回来有个题也要用,只能再学一遍,之前也是,不会为什么不学呢.我觉得是因为他们讲的不太容易理解,所以我自己给那些不会的人们讲一 ...

  4. UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  5. 链式前向星版DIjistra POJ 2387

    链式前向星 在做图论题的时候,偶然碰到了一个数据量很大的题目,用vector的邻接表直接超时,上网查了一下发现这道题数据很大,vector可定会超的,不会指针链表的我找到了链式前向星这个好东西,接下来 ...

  6. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  7. poj-1459-最大流dinic+链式前向星-isap+bfs+stack

    title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...

  8. 链式前向星DFS

    本文链接:http://www.cnblogs.com/Ash-ly/p/5399057.html 采用链式前向星存图的DFS: #include <iostream> #include ...

  9. 三种邻接表存图模板:vector邻接表、数组邻接表、链式前向星

    vector邻接表: ; struct Edge{ int u,v,w; Edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;} }; vector< ...

随机推荐

  1. hdu6007 spfa+完全背包

    题意:给你M,N,K,代表你有M点法力值,N个物品,K个制造方式 接下来N行,如果以1开头则代表既能卖又能合成,0代表只能卖. 然后K行,每行第一个数是要合成的东西,第二个数代表有几对,每对第一个数是 ...

  2. Xilinx的DocNav文件导航中的文档开头字母缩写都是什么意思?

    在安装Xilinx的开发软件后都会附带安装一个用于查阅Xilinx技术文档的文件导航工具DocNav. 在DocNav中可以找到几乎所有对我们开发Xilinx FPGA有用的技术文档,其中的文档数量更 ...

  3. 阿里短信回持.net sdk的bug导致生产服务cpu 100%排查

    一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk. 网址:https://help.aliyun.com/documen ...

  4. 剑指Offer之链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点.   思路:首先计算出链表的长度,再计算出倒数第k个是正数第几个,找到该结点即可. public ListNode FindKthToTail(Li ...

  5. JVM调优总结(八)-反思

    垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...

  6. 四、Spring-面向切面编程

    内容 面向切面编程基本原理 通过POJO创建切面 使用@AspectJ注解 为AspectJ切面注入依赖 关键词 横切关注点(cross-cutting concern) 继承 (inheritanc ...

  7. 第三篇-用Flutter手撸一个抖音国内版,看看有多炫

    前言 前一篇已经开发了大部分框架,包含视频上下滑动播放,这次将上次未完成的数据显示友好显示,以及底部音乐走马灯特效,另外优化了加载数据的bug,在dart语言里 & 会自动变成&  另 ...

  8. 关于做好ASO工作的十点有效建议

    导语: 互联网上关于如何做好ASO的内容多种多样,鱼目混珠.有从数据分析角度的方法论:有从运营工具角度的方法论:也有从实践角度看如何做好的. 本文将“对症下药”,从影响ASO的十大因素出发,整理出一份 ...

  9. [FlashDevelop] 001.FlashDevelop + LayaFlash环境搭建

    产品简介: 唯一使用Flash直接开发或转换大型HTML5游戏的全套解决方案. 开发工具 FlashDevelop + JDK + flashplayer_18_sa_debug + LayaFlas ...

  10. 不可不知的辅助测试的Fiddler小技巧

    在以前的博文中,时常有分享Fiddler的一些使用技巧,今天再贴下. Fiddler抓包工具使用详解 利用Fiddler拦截接口请求并篡改数据 Fiddler使用过程中容易忽略的小技巧 Mock测试, ...