数据结构文章推荐: |
---|
👉 顺序表和链表实现图书管理系统 |
👉 指针如何赋值?关于指针的理解 |
👉 多种方式实现英文单词词频统计和检索系统 |
👉 待更新 |
内容要求:
试基于图的深度优先搜索策略写一个算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。并请设计程序测试该算法的有效性。
代码实现(仅供参考):
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100 //最大边数
typedef struct ArcNode{//弧结点
int ajdVex; //弧终点指针位置
ArcNode* next; //下一条弧的指针
};
typedef struct Node{//顶点结点
ArcNode* Arc; //指向依附该顶点的弧指针
};
typedef struct Graph{//邻接表
Node adjlist[MAXN]; //点集
bool visited[MAXN]; //是否被遍历
int n,m; //顶点数和弧数
};
Graph *G = (Graph*)malloc(sizeof(Graph));
int i,j,k;bool hasPath = false;
void createLink(){//创建邻接表
printf("请输入顶点数n 弧数m:");
scanf("%d %d",&G->n,&G->m);
printf("创建的所有点:");
for(i=0;i<G->n;i++){ G->adjlist[i].Arc = 0;printf("V%d ",i);}printf("\n");
for(j=0;j<G->m;j++){
printf("第%d条弧起点编号、终点编号:",j+1);
scanf("%d %d",&i,&k);
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->ajdVex = k; //将边所指向的点编号赋值
p->next = G->adjlist[i].Arc;
G->adjlist[i].Arc = p;
}
}
void print_Graph(){//输出邻接表
ArcNode *p;
for(i=0;i<G->n;i++){
p = G->adjlist[i].Arc;
printf("V%d",i);
while(p){
printf("->V%d",p->ajdVex);
p = p->next;
}printf("\n");
}
}
void existPath(int d,int z){//两点是否连通
G->visited[d] = true;
ArcNode *p = G->adjlist[d].Arc;
if(d == z)hasPath = true;
while(p){
if(p->ajdVex==z)hasPath = true;
if(!G->visited[p->ajdVex])existPath(p->ajdVex,z);
p = p->next;
}
}
void print_Path(int d,int z){//输出两点连接路径
ArcNode *p = G->adjlist[d].Arc;
printf("路径为:V%d",d);
while(p){
printf("->V%d",p->ajdVex);
if(p->ajdVex == z)break;
p = G->adjlist[p->ajdVex].Arc;
}printf("\n");
}
void setFlase(){//visited置零
hasPath = false;
for(i=0;i<G->n;i++) G->visited[i] = false;
}
int main(){
createLink();
while(true){printf("\n");
printf("请输入操作(1.打印信息 2.判断路径 3.退出):");
int choice; scanf("%d",&choice);setFlase();
if(choice == 1) print_Graph();
if(choice == 2){
printf("请输入两点编号:"); scanf("%d %d",&i,&k);existPath(i,k);
if(hasPath){printf("两点连通!\n");print_Path(i,k);}
else printf("两点不连通!\n");
}
if(choice == 3)break;
}
return 0;
}
实现效果:
这个问题专门考察了我们对深度优先搜索的使用熟练程度,同时也加深了我们对图的操作。
最后,如果有问题的话欢迎交流!有帮助的话别忘了支持一下哦! 👍👍👍