如何在路线中找到边缘

时间:2016-03-13 15:54:33

标签: algorithm graph tree graph-algorithm

假设我有一个这样的图表 sample graph

我想找到1 to 3的所有边缘,即1 2... 2 4... 4 3。我可以非常轻松地编写1 to 5的代码,但是当下一个节点按降序排列时,我的代码就不起作用了。请帮帮我。

这是我的代码: - 如果i和j之间存在边缘则给出: -     arr[i][j]=0 其中s是节点总数,我必须找到a and b

之间的边
for(int i=a;i!=b;)
   {
        for(int j=1;j<=s;j++)
        {
             if(arr[i][j]==0)
             {
           //cout<<i<<" "<<j<<endl;
           i=j;
             }
        }
   }

1 个答案:

答案 0 :(得分:0)

这可以使用Breadth first search algorithm来解决,我们可以在执行BFS时跟踪当前节点的父节点,然后可以构建路径,如果路径存在,我在下面写了一个c ++解决方案< / p>

#include<iostream>
#include<queue>

using namespace std;

int n, arr[100][100], par[100], vis[100], ans[100];

void bfs(int start, int end){
    queue<int> Q;
    Q.push(start);
    par[start] = -1;vis[start] = 1;
    bool found = false;
    while(Q.size() > 0){
        int v = Q.front();
        Q.pop();
        if(v == end){
            found = true;
            break;
        }
        for(int i = 1;i <= n;i++){
            if(arr[v][i] == 0 || vis[i] == 1) continue;
            Q.push(i);vis[i] = 1;
            par[i] = v;
        }
    }
    if(found == false){
        cout << "No Path Found" << endl;return;
    }
    int curr = end, len = 0;
    while(curr != -1){
        ans[len++] = curr;
        curr = par[curr];
    }
    for(int i = len-1;i >= 1;i--) cout << ans[i] << " " << ans[i-1] << endl;
}

int main(){
    n = 5;
    arr[1][2] = 1;arr[2][1] = 1;
    arr[2][4] = 1;arr[4][2] = 1;
    arr[4][5] = 1;arr[5][4] = 1;
    arr[3][4] = 1;arr[4][3] = 1;

    bfs(1, 3);

    return 0;
}

指向Ideone上的解决方案:http://ideone.com/X8QnNu