我想找到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;
}
}
}
答案 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