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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B程洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值