目录

一、链式前向星存图

二、两种遍历方法


一、链式前向星存图:(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. MySQL执行外部sql脚本文件命令是报错:unknown command

    使用source导入外部sql文件: mysql> source F:\php\bookorama.sql; -------------- source F: -------------- ER ...

  2. hdu2093 考试排名(还需完善)

    下面代码是借鉴的.好多的知识点等着完善 #include <iostream> #include <string> #include <algorithm> usi ...

  3. Freemarker + iTextRender 实现根据模板网页生成PDF

    #0 背景 工作需要实现导出PDF的功能,在进行简单调研后,我决定采用Freemarker + iTextRender进行实现. 基本思路如下: Freemarker实现根据动态数据渲染出需要导出的H ...

  4. Kivy中显示汉字的问题

    1. kivy中显示中文乱码和提示错误的原因: 编码问题 字体问题 2. 字体问题的解决 可以下载支持中文的字体文件ttf,我这里使用了微软雅黑中文简体msyh.ttf.我们在编写布局时可以直接在相关 ...

  5. java方式实现归并排序

    一.基本思想 归并排序是建立在归并操作上的一种排序算法,该算法是采用分治法的一个典型应用.具体操作如下:所谓的分治就是分而治之,以一分为二的原则,先把序列平均分解成二个左右子序列,然后递归左右二个子序 ...

  6. windows下grunt的快速入门

    1.认识grunt  grunt是什么:他是一套前端自动化工具,是一个基于nodejs的命令行工具.(Grunt和Grunt插件是通过npm  安装并管理的,所以首先要安装nodejs). grunt ...

  7. 01 . RabbitMQ简介及部署

    RabbitMQ简介 ​ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它 ...

  8. Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

    hive运行查询语句时报错: Error: org.apache.hive.service.cli.HiveSQLException: Error while processing statement ...

  9. 【Hadoop】配置全分布式模式

    分布式原理 配置 详细过程 假设有三台虚拟机,1台master主机namenode,2台slave奴隶机datanode 所有机器都要配好jdk.Java环境变量.hadoop_env.sh里java ...

  10. JAVASE(十三) 异常处理

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.异常体系结构 ​ 说明: |-----Throwable |-----Error :没针对性代码进行 ...