【问题标题】:how to modify the BFS algorithm to find a path between 2 vertices with a given condition?如何修改 BFS 算法以在给定条件下找到 2 个顶点之间的路径?
【发布时间】:2019-05-26 17:04:05
【问题描述】:

我刚开始学习图表并陷入了这个问题。 我试图找到图的两个顶点之间的最短路径(最小边数),条件是在路径的每 2 个中间顶点之间有 2 条替代路径(不计算长度)。

这是我的 BFS 算法。 颜色表示:

  • 白色 = 尚未达到

  • 灰色 = 到达的顶点将保持该颜色,直到其所有邻居都无法到达

  • 黑色 = 到达顶点

pi[] 包含当前顶点的父节点

void bfs(int s)
{
    int i;

    for (i=1; i<=v; i++)
    {
        if (i != s)
        {
            color[i] = WHITE;
            d[i] = INFTY;
            pi[i] = NIL;
        }
    }
    color[s] = GRAY;
    d[s] = 0;
    pi[s] = NIL;
    queueInit(&q);
    queuePush(&q,s);
    while (!queueEmpty(&q))
    {
        int u = queueFront(&q);
        int j;
        for (j=1; j<=adj[u][0]; j++)
        {
            int x = adj[u][j];
            if (color[x] == WHITE)
            {
                color[x] = GRAY;
                d[x] = d[u]+1;
                pi[x] = u;
                queuePush(&q,x);
            }
        }
        queuePop(&q);
        color[u] = BLACK;
    }
}

请帮我改变算法以找到给定条件下的最短路径,或者至少给我一个建议!

【问题讨论】:

    标签: c graph shortest-path breadth-first-search


    【解决方案1】:

    如果您开始调试您的代码,您会发现其中一个问题是在循环到其相邻节点之前不会弹出节点,所以毕竟算法会在它们上再次运行,并且一些节点在算法运行之前被弹出。

    我也不明白for (j=1; j&lt;=adj[u][0]; j++) 行,它在相邻顶点上循环。

    来自cp-algorithms的BFS算法实现:

    vector<vector<int>> adj;  // adjacency list representation
    int n; // number of nodes
    int s; // source vertex
    
    queue<int> q;
    vector<bool> used(n);
    vector<int> d(n), p(n);
    
    q.push(s);
    used[s] = true;
    p[s] = -1;
    while (!q.empty()) {
        int v = q.front();
        q.pop(); // The node should be poped before looping on it's adjacent nodes
        for (int u : adj[v]) {
            if (!used[u]) {
                used[u] = true;
                q.push(u);
                d[u] = d[v] + 1;
                p[u] = v;
            }
        }
    }
    

    然后,假设我们要打印最短路径:

    if (!used[u]) {
        cout << "No path!";
    } else {
        vector<int> path;
        for (int v = u; v != -1; v = p[v])
            path.push_back(v);
        reverse(path.begin(), path.end());
        cout << "Path: ";
        for (int v : path)
            cout << v << " ";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2021-03-04
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多