图的开始--第一天打卡之图的遍历(dfs)
作者:
lgd123
,
2021-07-25 18:42:14
,
所有人可见
,
阅读 244
/*图的深度优先搜索
这题是,输入一个图的邻接表的形式,输出深搜时,经过每一个点的开始时间和最后经过这一点的结束时间。
1、深度优先搜索是图的最基本搜索算法,它秉承着“能走多远做多远”的原则。
2、图中的DFS是尽可能的访问该顶点的相邻顶点,当某顶点的所有边都全部搜索完毕后,回溯,找到该条路径点的另一个相邻顶点。
3、在图中每个顶点只遍历一次,所以会需要俩判断的标志,同时也就需要俩数组来储存。
4、标志1:第一次遇到V的时刻
5、标志2:访问完V的邻接表的时刻,即结束时刻。
6、在数据范围较大的时候,使用递归会导致递归次数过多,栈溢出。
注:这里的代码采用了栈去实现dfs,同时有个将邻接表转化成邻接矩阵的操作(虽然多此一举,但毕竟是例题)
*/
----------
**//两种形式之一:递归实现dfs**
#include<iostream>
#include<cstring>
#define white 0;
#define gray 1;
#define black 2;
//其中white表示没有访问过该点,gray表示访问了一次该点,但还没有结束,black表示已经结束了所有的访问。
using namespace std;
const int N = 110;
int n,m[N][N];
int color[N],d[N],f[N],hh;
//color[]类似于标记,是否访问,d[],f[]为要输出的答案
void dfs_hexin(int u)
{
color[u]=gray;
d[u]=++hh;
//寻找与u相邻的顶点。
for(int i=0;i<n;i++)
{
if(m[u][i]==0) continue;
if( color[i]==0 )
{
dfs_hexin(i);
}
}
//回溯
color[u]=black;
f[u]=++hh;
}
void dfs_paimian()
{
memset(color,0,sizeof(color));
hh=0;
for(int i=0;i<n;i++)
{
if(color[i]==0) dfs_hexin(i);
}
for(int i=0;i<n;i++)
{
cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
}
}
int main()
{
int b,c,d;
cin>>n;
memset(m,0,sizeof(m));
for(int i=0;i<n;i++)
{
cin>>b>>c;
b--;
for(int j=0;j<c;j++)
{
cin>>d;
d--;
m[b][d]=1;
}
}
dfs_paimian();
system("pause");
return 0;
}
----------
**//两种实现方式之栈实现:**
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
const int N = 110;
const int WHITE = 0;
const int GRAY = 1;
const int BLACK = 2;
int n,m[N][N];
int color[N],d[N],f[N],tt;
int nt[N];
int next(int u)
{
for(int v = nt[u];v<n;v++)
{
nt[u]= v+1;
if(m[u][v]) return v;
}
return -1;
}
void dfs_hexin(int r)
{
for(int i=0;i<n;i++) nt[i] = 0;
stack<int> s;
s.push(r);
color[r]=1;
d[r]=++tt;
while(!s.empty())
{
int u = s.top();
int v = next(u);
if(v!=-1)
{
if(color[v]==0)
{
color[v]=1;
d[v]=++tt;
s.push(v);
}
}else{
s.pop();
color[u]=2;
f[u]=++tt;
}
}
}
void dfs()
{
for(int i=0;i<n;i++)
{
color[i]=0;
nt[i] = 0;
}
tt = 0;
for(int u = 0;u<n;u++)
{
if(color[u]==0) dfs_hexin(u);
}
for(int i = 0;i < n;i++)
{
cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
}
}
int main()
{
int u,v,k;
cin>>n;
memset(m,0,sizeof(m));
for(int i=0;i<n;i++)
{
cin>>u>>v;
u--;
for(int j=0;j<v;j++)
{
cin>>k;
k--;
m[u][k]=1;
}
}
dfs();
//system("pause");
return 0;
}