u->v是否存在路径(简单路径)
void ExistPath(AdjGraph* G, int u, int v, bool& has)
{
int w;
ArcNode* p;
visited[u] = 1;//从u开始
if (u == v)
{
has = true;
return;
}
p = G->adjlist[u].firstarc; //p指向第一个邻接点
while (p != NULL)
{
w = p->adjvex; //邻接点编号
if (visited[w] == 0) //没有访问过就递归
ExistPath(G, w, v, has);
p = p->nextarc; //下一个邻接点位置
}
}
输出一条简单路径
void FindPath(AdjGraph* G, int u, int v, int path[], int d)
{
int w, i;
ArcNode* p;
visited[u] = 1;
d++; //d初始为-1
path[d] = u;
if (u == v) //找到直接返回
{
for (int i = 0; i <= d; i++)
cout << path[i] << " ";
cout << endl;
return;
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visited[w] == 0)
FindPath(G, w, v, path, d);
p = p->nextarc;
}
}
输出所有简单路径
void FindAllPath(AdjGraph* G, int u, int v, int path[], int d)
{
int w, i;
ArcNode* p;
d++;
path[d] = u;
if (u == v && d >= 0)
{
for (int i = 0; i <= d; i++)
cout << path[i] << " ";
cout << endl;
return;
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visited[w] == 0)
FindAllPath(G, w, v, path, d);
p = p->nextarc;
}
visited[u] = 0; //恢复现场
}
长度为l的所有简单路径
void PathlenAll(AdjGraph* G, int u, int v, int l, int path[], int d)
{
int w, i;
ArcNode* p;
d++;
path[d] = u;
if (u == v && d == l)
{
for (int i = 0; i <= d; i++)
cout << path[i] << " ";
cout << endl;
return;
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visited[w] == 0)
PathlenAll(G, w, v, l, path, d);
p = p->nextarc;
}
visited[u] = 0; //恢复现场
}
过k点的所有简单回路
void DFSPath(AdjGraph* G, int u, int v, int path[], int d)
{
int w, i;
ArcNode* p;
d++;
path[d] = u;
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (w == v && d > 0)
{
cout << " ";
for (i = 0; i <= d; i++)
cout << path[i];
cout << v;
}
if (visited[w] == 0)
DFSPath(G, w, v, path, d);
p = p->nextarc;
}
visited[u] = 0;
}
void FindCyclePath(AdjGraph* G, int k)
{
int path[MAXV];
DFSPath(G, k, k, path, -1);
}