目录

一、链式前向星存图

二、两种遍历方法


一、链式前向星存图:(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. Hive-拉链表

    一.问答介绍 1.什么是拉链表? 维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户 ...

  2. Spring 基于注解的配置 简介

    基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...

  3. Spring IOC 容器 简介

    Spring 容器是 Spring 框架的核心.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁. Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件. ...

  4. PAT-1080 Graduate Admission (结构体排序)

    1080. Graduate Admission It is said that in 2013, there were about 100 graduate schools ready to pro ...

  5. C语言基础知识(一)——关键字

    存储类别说明符变量:auto.register.static.extern._Thread_local.typedef 存储类型限定符:const.volatile.restrict._Atomic ...

  6. 【谎言大揭秘】Modin真的比pandas运行更快吗?

    最近看了某公众号文章,推荐了所谓的神器,据说读取速度吊打pandas,可谓牛逼,事实真是这样吗? 来一起揭秘真相. 首先安装包. # pip install ray # pip install das ...

  7. Nginx 配置文件语法

    一.语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码 ...

  8. 循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

    在我们开发Vue应用的时候,很多时候需要记录一些变量的内容,这些可以用来做界面状态的承载,也可以作为页面间交换数据的处理,处理这些内容可以归为Vuex的状态控制.例如我们往往前端需要访问后端数据,一般 ...

  9. 二、Spring装配Bean

    内容 声明bean 构造器注入和Setter方法注入 装配Bean 控制bean的创建和销毁 关键词 装配(wiring) 组件扫描(component scanning) 自动装配(AutoWiri ...

  10. 【C++】赋值过程中类型转换

    注意:以下内容摘自文献[1],修改了部分内容. 1.赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换. (1) 将浮点型数据(包括单.双精度)赋给 ...