邻接表存储的无向图DFS BFS 和判断是否两点之间有一条路径

1.采用邻接表或邻接矩阵作存储结构。
   2.键盘输入节点个数、名称、边。
   3.输出对应的邻接表或邻接矩阵。
   4.输出二个遍历结果。
   5.利用遍历算法判断图中的两个顶点之间是否存在路径。

#include<bits/stdc++.h>
using namespace std;
#define MAX_NUM 20
    typedef struct ArcNode {  //表节点
        int adjvex; //邻接点
        struct ArcNode *nextarc;//指向下一条弧的指针
    }ArcNode;
    typedef int VertexType;
    typedef struct VNode {  //头结点
        VertexType data;//定点信息
        ArcNode *firstarc;  //指向第一个依附该顶点的弧的指针
    }VNode,AdjList[MAX_NUM]; //邻接链表
    void createDgraph(AdjList &g,int n){  //创建图
        ArcNode *p,*q;
        int i,j;
        for (i=1;i<=n;i++)
        {
            g[i].data=i;
            g[i].firstarc=NULL;
        }
        printf("\nEdgei->j:");
        scanf("%d%d",&i,&j);
        while (i!=-1)
        {
            p=(ArcNode *)malloc(sizeof(ArcNode));
			q=(ArcNode *)malloc(sizeof(ArcNode));
            p->adjvex=j;
            p->nextarc=g[i].firstarc;
            g[i].firstarc=p;
            q->adjvex=i;
            q->nextarc=g[j].firstarc;
            g[j].firstarc=q;
            printf("\nEdge i->j:");
            scanf("%d%d",&i,&j);
        }
    }
	int visited[MAX_NUM]={0};
	void DFS(AdjList G,int v){//遍历
		ArcNode *p;
		visited[v]=1;//已被访问过
		printf("%d ",v);
		p=G[v].firstarc;
		while(p!=NULL){
			if(visited[p->adjvex]==0){//若w=p->adjvex 顶点未访问,递归访问它
				DFS(G,p->adjvex);
			}
			p=p->nextarc;//访问过p指向顶点v的下一个邻接点
		}
	}

	void BFS(AdjList G,int v){
		ArcNode *p;
		int Qu[20],front,rear;//定义循环队列
		int visited[20]={0};
		int w,i;
		front=rear=0;//初始化队列
		printf("%d ",v);
		visited[v]=1;
		rear=(rear+1)%20;
		Qu[rear]=v;//v进队
		while(front!=rear){
			front=(front+1)%20;
			w=Qu[front];//出队并赋给w
			p=G[w].firstarc;//找与顶点w邻接的第一个顶点
			while(p){
				if(visited[p->adjvex]==0){//弱当前顶点未被访问
					printf("%d ",p->adjvex);//访问邻接顶点
					visited[p->adjvex]=1;
					rear=(rear+1)%20;//该顶点进队
					Qu[rear]=p->adjvex;
				}
				p=p->nextarc;
			}
		}
	}
    void printDgraph(AdjList g,int n){ //输出图的访问节点
        ArcNode *p;
        int i;
        for (i=1;i<=n;i++)
        {
            printf("\n%d: ",g[i].data);
            p=g[i].firstarc;
            while (p)
            {
                printf("->%d",p->adjvex);
                p=p->nextarc;
            }
        }
    }

    int juiceroad(AdjList g,int n,int x,int y){
        ArcNode *p;
        for(int i=1;i<=n;i++){
           if(g[i].data==x)
            {
                p=g[i].firstarc;
                while(p){
                    if(p->adjvex==y){
                        //printf("存在一条这样的路径!");
                        return 1;
                    }
                    else p=p->nextarc;
                }
            }
        }
        return 0;
    }
    int main()
    {
        AdjList g;
        int num;
        printf("输入图的节点的个数");
        scanf("%d",&num);
        createDgraph(g,num);
        printf("输出无向图的邻接表(访问路径):");
        printDgraph(g,num);
        printf("\n");
		printf("深度优先:");
		DFS(g,num);
		printf("\n");
		printf("广度优先:");
		BFS(g,num);
		printf("\n");
		int x, y;
		while(~scanf("%d%d",&x,&y)){
            int result=juiceroad(g,num,x,y);
		    if(result) printf("存在一条这样的路径!\n");
            else printf("不存在一条这样的路径\n");
		}
        return 0;
    }

在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值