今天我们来到了图的深度优先遍历,在这里我们先明白图是一种什么结构,值得留意的是图是一个多对多或少对多的结构,还有就是图的存储方式,有两种哈,第一种是临接表形式,就是每一个结点都可以当作为链表的头,看看这个头跟哪几个结点存在边关系,就把那几个结点保存在以该结点为头的链表上,哈哈想着是不是有点麻烦,所以我们想到了更好的方法,制作一个

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);
} 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐