用栈来实现DFS



#include <iostream>

#include <stack>


using namespace std;


static const int N=100;
static const int WHITE=0;
static const int GRAY=1;
static const int BLACK=2;
int n,M[N][N];
int d[N],f[N],color[N],time;


int next(int u) //主要是为了遍历结点u的所有邻接结点
{
    for(int v=0;v<n;v++)
    {
        if(M[u][v]&&color[v]==WHITE) return v;
    }
    return -1;
}


void dfs_visit(int r)
{


    stack<int> S;
    S.push(r);
    color[r]=GRAY;
    d[r]=++time;


    while(!S.empty())
    {
        int u=S.top();
        int v=next(u);
        if(v!=-1)
        {
            if(color[v]==WHITE)//结点未被访问呢
            {
                color[v]=GRAY;//表示正在访问当前结点
                d[v]=++time;//当前结点的初始访问时间加1
                S.push(v);//v结点入栈
            }
        }
        else
        {
            S.pop();//弹出栈当中的嘴上层结点
            color[u]=BLACK;
            f[u]=++time;
        }
    }
}


void dfs()
{
    for(int i=0;i<n;i++)
    {
        color[i]=WHITE;//表示该顶点还没有被访问
    }
    time=0;


    for(int u=0;u<n;u++)
    {
        if(color[u]==WHITE) dfs_visit(u);
    }
    for(int i=0;i<n;i++)
    {
        cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
    }
}




int main()
{
   int u,k,v;
   cin>>n;


   for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
   {
       M[i][j]=0;
   }


   for(int i=0;i<n;i++)
   {
       cin>>u>>k;
       for(int j=0;j<k;j++)
       {
           cin>>v;
           M[u-1][v-1]=1;
       }
   }


   dfs();
   return 0;
}




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS(深度优先搜索)是一种基于栈的搜索算法,可以用于寻路等问题。以下是使用栈实现DFS寻路算法的基本步骤: 1. 创建一个栈,并将起始点压入栈中。 2. 循环执行以下步骤,直到找到终点或栈为空: - 从栈中弹出一个节点作为当前节点。 - 如果当前节点是终点,则返回寻路路径。 - 如果当前节点未被访问过,则将其标记为已访问,并将其相邻且未被访问过的节点压入栈中。 3. 如果栈为空并且仍未找到终点,则返回无法到达终点的结果。 下面是使用栈实现DFS寻路算法的示例代码: ```csharp public List<Node> DFS(Node start, Node end) { Stack<Node> stack = new Stack<Node>(); Dictionary<Node, bool> visited = new Dictionary<Node, bool>(); Dictionary<Node, Node> parent = new Dictionary<Node, Node>(); List<Node> path = new List<Node>(); stack.Push(start); visited[start] = true; while (stack.Count > 0) { Node curr = stack.Pop(); if (curr == end) { // 构建路径 while (curr != null) { path.Add(curr); curr = parent.ContainsKey(curr) ? parent[curr] : null; } path.Reverse(); return path; } foreach (Node neighbor in curr.neighbors) { if (!visited.ContainsKey(neighbor) || !visited[neighbor]) { visited[neighbor] = true; parent[neighbor] = curr; stack.Push(neighbor); } } } // 未找到终点 return null; } ``` 在这个示例代码中,我们使用了 Dictionary 类型来存储节点的访问状态和父节点,以便在找到终点后构建路径。你可以根据实际情况来修改这个代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值