问题描述:
采用邻接表的存储结构,编写一个算法,判别无向图中任意给定的啷个顶点之间是否存在一条长度为 k 的简单路径。
完整代码:
#include<cstdio>
#include<cstring>
#define Maxnum 100
//边结点
typedef struct ArcNode
{
int adjvex;//边结点在顶点表中的下标
struct ArcNode *next;
} ArcNode;
//顶点
typedef struct VNode
{
char data;
ArcNode * firstarc;
}VNode;
//邻接表
typedef struct
{
VNode vertex[Maxnum];
int vernum;
int arcnum;
}ALGraph;
//find 函数,查找数据域为e的顶点下标
int find(ALGraph G, char e)
{
for(int i=0; i<G.vernum; i++)
{
if(G.vertex[i].data==e)
return i;
}
return -1;
}
//创建无向图邻接表
void createAlGraph(ALGraph &G)
{
scanf("%d%d", &G.vernum, &G.arcnum);
getchar();
for(int i=0; i<G.vernum; i++)
{
//输入顶点信息
scanf("%c", &G.vertex[i].data);
getchar();
G.vertex[i].firstarc=NULL;
}
ArcNode *p;
for(int i=0; i<G.arcnum; i++)
{
char v1, v2;
scanf("%c %c", &v1, &v2);
getchar();
int j = find(G, v1);
int k = find(G, v2);
//将k加到j的边结点中
p = new ArcNode;
p->adjvex = k;
p->next = G.vertex[j].firstarc;
G.vertex[j].firstarc = p;
//将j加到k的边结点中
p=new ArcNode;
p->adjvex = j;
p->next = G.vertex[k].firstarc;
G.vertex[k].firstarc = p;
}
}
//标志数组,表征顶点的访问与否
bool visited[Maxnum];
//查找无向图中是否存在一条以i为起点,j为终点,长度为k的简单路径
bool path_is_existence(ALGraph G,int i,int j,int k)
{
if(i==j && k==0)
return 1;
else if(k>0)
{
//标记为已访问
visited[i] = 1;
ArcNode *p = G.vertex[i].firstarc;
while(p)
{
if(!visited[p->adjvex])
{
//如果与 i 邻接的顶点到 j 之间存在一条长度为 k-1 的简单路径,函数返回1(缩小了问题规模)
if( path_is_existence(G, p->adjvex, j, k-1) )
return 1;
}
//p指向下一个与i相邻的顶点
p = p->next;
}
//没有找到,visited[i]要重新赋值为0,可能从其他路径通过该点到达终点
visited[i] = 0;
}
//没有找到,返回 0
return 0;
//注意: 递归程序的出口和状态转移
}
int main()
{
ALGraph G;
createAlGraph(G);
memset(visited, 0, sizeof(visited));
int i, j, k;
scanf("%d%d%d", &i, &j, &k);
printf("%d", path_is_existence(G, i, j, k));
return 0;
}
(测试用例输入图示)
测试结果:
注:输出 结果中(1表示存在 ,0表示不存在)指定路径