判断有向图中两个结点是否可达

本文介绍了邻接表结构的定义及如何创建邻接表,包括两个具体的图实例。同时,展示了深度优先搜索(DFS)和广度优先搜索(BFS)在判断图中两个顶点是否存在路径的实现。代码详细展示了邻接表的构造过程以及DFS和BFS的遍历过程。
摘要由CSDN通过智能技术生成

邻接表结构

#define MaxVertexNum 100   //结点数目最大值
//邻接表
typedef struct ArcNode  //边表结点
{
  int adjvex;             //弧指向的顶点位置(顶点表结点数组下标)
  struct ArcNode *next;   //指向下一条弧的指针
}ArcNode;

typedef struct Vnode    //顶点表结点
{
  int data;        //顶点标识
  ArcNode *first;   //指向第一条依附该顶点的弧的指针
}Vnode,AdjList[MaxVertexNum];

typedef struct 
{
   AdjList vertices;
   int vexnum=0,arcnum=0; 
}ALGraph;

创建邻接表

ALGraph* CreateAG1()
{
  /*       
  0-->1-->2-->3
  0--1
  1--2
  2--3
  
  */
  ALGraph *G = new ALGraph();
  G->vexnum = 4; 
  G->arcnum = 3;
  //创建 n 个结点 --顶点表
  for(int i=0;i<G->vexnum;i++)
  {
    G->vertices[i].data = i;
    G->vertices[i].first = NULL;
  }
  for(int i=0;i<G->arcnum;i++)
  {
    //创建1个边表结点
    ArcNode *p = new ArcNode();
    p->adjvex = i+1 ; p->next= NULL;
    G->vertices[i].first = p;
  }
  return G;
}

ALGraph* CreateAG2()
{
  /*   -->5     
  0-->1-->2-->3   
           -->4 
  0--1
  1--5--2
  2--4--3
  */
  ALGraph *G = new ALGraph();
  G->vexnum = 6; 
  G->arcnum = 4;
  //创建 n 个结点 --顶点表
  for(int i=0;i<G->vexnum;i++)
  {
    G->vertices[i].data = i;
    G->vertices[i].first = NULL;
  }
  for(int i=0;i<3;i++)
  {
    //创建1个边表结点
    ArcNode *p = new ArcNode();
    p->adjvex = i+1 ; p->next= NULL;
    G->vertices[i].first = p;
  }
  ArcNode *p = new ArcNode();
  p->adjvex = 5;   //连到1后
  p->next = G->vertices[1].first;
  G->vertices[1].first = p;
  ArcNode *q = new ArcNode();
  q->adjvex = 4;   //连到2后
  q->next = G->vertices[2].first;
  G->vertices[2].first = q;
  return G;
}

打印邻接表

void Print(ALGraph *G)
{
  //打印邻接表
  for(int i=0;i<G->vexnum;i++)
  {
    cout<<G->vertices[i].data<<"-->";
    ArcNode *p = G->vertices[i].first;
    while(p!=NULL)
      {
        cout<<p->adjvex<<"-->";
        p=p->next;
      }
    cout<<"NULL"<<endl;
  }
}

DFS判断

//DFS  用一个变量记录是否找到  只进行一次DFS
void DFS_Judge(ALGraph *G, int i, int j,bool &Reach)
{
  if(i==j||Reach==true)
  {
    Reach = true;
    return ;
  }
  visited[i] = 1;  //已访问
  for(int w = FirstNeighbor(G,i);w>=0;w=NextNeighbor(G,i,w))
  {
    if(!visited[w] &&!Reach)  //没找到且未访问
      DFS_Judge(G,w,j,Reach);
  }
}

BFS判断

queue<int> Q;
void BFS_Judge(ALGraph *G,int i,int j, bool &Reach)
{
  //顶点i入队
  Q.push(i);
  while(!Q.empty())
  {
    int u = Q.front();  //取出队头
    Q.pop();  //弹出
    visited[u] = 1;
    if(u==j) Reach =true;
    //入队邻接点
    for(int w=FirstNeighbor(G,u);w>=0;w = NextNeighbor(G,u,w))
    {
      if(w==j)
        {
          Reach =true; return ;
        }
      if(!visited[w])
      {
        Q.push(w);
        visited[w]=1;
      }
    }
  }
}

main函数

int main()
{
  ALGraph *G=CreateAG1();
  ALGraph *H =CreateAG2();
  Print(G);  Print(H);
  bool Reach1 = false, Reach2 = false;
  DFS_Judge(G,0,1,Reach1);
  DFS_Judge(H,3,4,Reach2);
  cout<<Reach1<<" "<<Reach2 <<endl;
  fill(visited.begin(),visited.end(),0);
  Reach1 = false, Reach2 = false;
  BFS_Judge(G,0,1,Reach1);
  BFS_Judge(H,2,4,Reach2);
  cout<<Reach1<<" "<<Reach2 <<endl;
  system("pause");
  return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值