C语言实现的图的深度搜索与广度搜索程序
C语言实现的图的深度搜索与广度搜索程序
/*
上机试验5-图的建立和遍历
1)建立【无向】【非连通】图的邻接表存储结构,要求顶点个数不少于15个。
2)用DFS及BFS对此邻接表进行遍历,打印出两种遍历的顶点访问顺序。
3)给定图中任意两个顶点v1和v2及整数k,判断是否存在从v1到v2的路径长度为k的简单路径,若有打印出路径上的顶点序列(要求路径上不含回路)。
进一步:找出从v1到v2的所有路径长度为k的【简单】路径。(简单路径是指:顶点序列中不含【重现】的顶点的路径。)
*/
#include
#include
#include
#define PointNum 15
using namespace std;
struct V{
int vertex;
int distance;
int sign;
struct V* next;
}Vertex[PointNum+1];
int P[PointNum];
int union_find(int x) // 并查集
{
while(P[x]!=x)x=P[x];
return x;
}
void DFS(int vertex_);
void BFS(int vertex_);
int DFS(int V1, int V2, int V3, int kn);
int lujing[PointNum+1],lujing_I;
int main()
{
int times,vertexNumbers,edgeNumbers,i,j,V1,V2,Distance,n=1,v1,v2,kn;
struct V *p,*q,*temp;
printf("请输入您所要进行的测试次数:");
scanf("%d",×);
while(times--)
{
printf("\n第%d组数据输入.\n",n++);
printf("请输入顶点数:");
scanf("%d",&vertexNumbers); //要保证vertexNumbers <= PointNum
for( i = 0 ; i < vertexNumbers ; i ++ )
{
Vertex[i].vertex = i;//
Vertex[i].distance = 0;
Vertex[i].sign = 0;
Vertex[i].next = NULL;
}
printf("请输入边数:");
scanf("%d",&edgeNumbers); //要保证vertexNumbers <= PointNum
for( i = 0 ; i < edgeNumbers ; i ++ )
{
printf("请输入数据:");
scanf("%d%d%d",&V1,&V2,&Distance);
p = &Vertex[V1];q = Vertex[V1].next;
while( q != NULL ){
p = q;
q = q->next;
}//出来的时候q指向Vertex[V1]邻接表的结尾-NULL,
temp = (struct V *)malloc(sizeof(Vertex[0]));
p->next = temp; temp->next = NULL;//接上temp
temp->vertex = V2; temp->distance = Distance;temp->sign = 0; //给temp赋值
p = &Vertex[V2];q = Vertex[V2].next;
while( q != NULL ){
p = q;
q = q->next;
}
temp = (struct V *)malloc(sizeof(Vertex[0]));///temp的问题???????
p->next = temp; temp->next = NULL;//接上temp
temp->ve