链式前向星存树图和遍历它的两种方法【dfs、bfs】
目录
一、链式前向星存图:(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】的更多相关文章
- 最短路 spfa 算法 && 链式前向星存图
推荐博客 https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...
- Pants On Fire(链式前向星存图、dfs)
Pants On Fire 传送门:链接 来源:upc9653 题目描述 Donald and Mike are the leaders of the free world and haven't ...
- C++算法 链式前向星存图
这个东西恶心了我一阵子,那个什么是什么的上一个一直是背下来的,上次比赛忘了,回来有个题也要用,只能再学一遍,之前也是,不会为什么不学呢.我觉得是因为他们讲的不太容易理解,所以我自己给那些不会的人们讲一 ...
- UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- 链式前向星版DIjistra POJ 2387
链式前向星 在做图论题的时候,偶然碰到了一个数据量很大的题目,用vector的邻接表直接超时,上网查了一下发现这道题数据很大,vector可定会超的,不会指针链表的我找到了链式前向星这个好东西,接下来 ...
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- poj-1459-最大流dinic+链式前向星-isap+bfs+stack
title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...
- 链式前向星DFS
本文链接:http://www.cnblogs.com/Ash-ly/p/5399057.html 采用链式前向星存图的DFS: #include <iostream> #include ...
- 三种邻接表存图模板: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< ...
随机推荐
- poj3177 无向连通图加多少条边变成边双连通图
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15752 Accepted: 6609 ...
- 技术大佬:我去,你竟然还不会用 this 关键字
上一篇文章写的是 Spring Boot 的入门,结果有读者留言说,Java 都还没搞完,搞什么 Spring Boot,唬得我一愣一愣的.那这篇就继续来搞 Java,推出广受好评的我去系列第四集:你 ...
- Maven——pom.xml文件报错:Missing artifact:jar包
原因:该错误原因为maven库中jar包无法更新 解决方法:找到maven库中对应的jar包路径,删除文件夹中的红框中的三个文件
- java链接redis
创建maven项目 2.导入jar包 <dependencies> <dependency> <groupId>redis.clients</groupId& ...
- Flexible 应用
Flexibl.js 为我们做了一项工作,媒体查询工作,节约了许多操作 举个例子,移动端的页面设计稿是750px,我们自己换算rem单位,比如我想把屏幕划分为15等份,我就750/15=50,然后用所 ...
- Python一键获取日漫Top100榜单电影信息
最近看到一个 UP 主做的视频,使用可视化动态图,把目前播放量最多的 UP 主一一列出来,结果第一名是哔哩哔哩番剧,第一名的播放量是第二名近 10 倍. B站的番剧数量,也是相对其他平台比较多的,而且 ...
- 如何利用Xpath抓取京东网商品信息
前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~ HTML文件其实就是由一组尖括号构成的 ...
- 微软:正式发布针对 .NET Core的 Winform 设计器
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://devblogs.microsoft.com/dotnet/windows-for ...
- MOS管的栅极和源极之间的电阻
MOS管的栅极和源极之间的电阻: 一是为场效应管提供偏置电压:二是起到泻放电阻的作用:保护栅极G-源极S: 保护栅极G-源极S: 场效应管的G-S极间的电阻值是很大的,这样只要有少量的静电就能使他的G ...
- 【C++】常量
注意:以下内容摘自文献[1],修改了部分内容. 1.常量:常量的值是不能改变的,一般从其字面形式即可判别是否为常量. 2.常量包括数值型常量(即常数)和字符型常量. 3.常量无unsigned型.但一 ...