7-1 图深度优先遍历(c++)
关于图结构的一些题
·
今天我们来到了图的深度优先遍历,在这里我们先明白图是一种什么结构,值得留意的是图是一个多对多或少对多的结构,还有就是图的存储方式,有两种哈,第一种是临接表形式,就是每一个结点都可以当作为链表的头,看看这个头跟哪几个结点存在边关系,就把那几个结点保存在以该结点为头的链表上,哈哈想着是不是有点麻烦,所以我们想到了更好的方法,制作一个
vector<int>node[MAXN];其中MAXN是我们已知最大的结点数,
然后每一个结点相当于node的第一个下标,对应的数组空间,
我们直接把每一个点存在边关系的其他点push_back到对应点的空间里面。
之后我们就可以开始读入操作了,
int wi,ma;cin>>wi>>ma;
for(int i=0;i<ma;i++)
{
int a,b;cin>>a>>b;node[a].push_back(b);
}
for(int i=0;i<wi;i++)
{
if(!node[i].empty())sort(node[i].begin(),node[i].end());
}
其目的就是将每一个结点对应的有关系的结点都存储在该结点下
因为这道题的结点是按顺序给的就可以,直接从0开始其的深度优先遍历,关于深度优先遍历,就是一个劲的先遍历完,之后再回去再一个劲的遍历完。关于这道题我们直接将点放入遍历,每一个点对应的相关的结点再进行遍历,用深度遍历法,但遍历过的得标记一下,因为题目给了有的点不一定联通,遍历代码如下
void dfs(int nd)将每个结点的关系结点遍历,重复此过程,遍历后将vist赋值为1并且将结点输出。
{
if(vist[nd]==0)
{
cout<<nd<<" ";
vist[nd]=1;
}
for(int i=0;i<node[nd].size();i++)
{
if(vist[node[nd][i]]==0)
dfs(node[nd][i]);
}
}
void dfs_1(int wi)目的是将每一个结点遍历,也可以理解为0为起始点
{
for(int i=0;i<wi;i++)
{
if(vist[i]==0)
dfs(i);
}
}
接下来就是主要代码了
#include<bits/stdc++.h>
using namespace std;
int vist[20010];
vector<int>node[20010];
void dfs(int nd)
{
if(vist[nd]==0)
{
cout<<nd<<" ";
vist[nd]=1;
}
for(int i=0;i<node[nd].size();i++)
{
if(vist[node[nd][i]]==0)
dfs(node[nd][i]);
}
}
void dfs_1(int wi)
{
for(int i=0;i<wi;i++)
{
if(vist[i]==0)
dfs(i);
}
}
int main()
{
int wi,ma;cin>>wi>>ma;
for(int i=0;i<ma;i++)
{
int a,b;cin>>a>>b;node[a].push_back(b);
}
for(int i=0;i<wi;i++)
{
if(!node[i].empty())sort(node[i].begin(),node[i].end());
}
dfs_1(wi);
}
更多推荐
所有评论(0)