我刚刚开始学习图形并陷入此问题。我试图在图的两个顶点之间找到最短路径(最小边数(,条件的条件是,该路径的每2个中间顶点之间都有2个替代路径(不会对lenght进行Mather(。
这是我的BFS算法。颜色是含义:
-
white =尚未达到
-
灰色=到达的顶点将保持这种颜色,直到他所有的邻居都无法到达
-
black =到达顶点
pi[]
包含curent顶点的父
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;
}
}
请帮助我更改算法以找到具有给定条件的最短路径,或者至少给我一个建议!
如果您开始调试代码,您会看到一个问题是节点在其相邻节点上循环之前不会弹出节点,因此毕竟,该算法再次在它们上运行,并且在其上运行算法之前会弹出一些节点。
我也不了解在相邻顶点上循环的线for (j=1; j<=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 << " ";
}