数据结构noj19图的深搜

1.邻接表存储方式(边点,顶点,顶点集(图))

typedef struct EdgeNode//边点
{
    int adjvex;
    struct EdgeNode *next;
}edge;
typedef struct vertexnode//顶点
{
    int data;
    edge* firstedge;
}vertexnode,Adjlist[105];
typedef struct LGraph//图
{
    int edgenum,nodenum;
    Adjlist adjlist;
}LGraph;

2.头插法的使用

3.深度优先遍历(递归,对每一个未访问过的顶点穷尽式发掘,再层层原路返回)

int FLAG=0;//判断是否能通过v2的标志,全局变量
void DFS(LGraph*G,int adjvex,int v2)//深度搜索
{
    edge*p;
    visited[adjvex]=1;//标记已经访问过
    p=G->adjlist[adjvex].firstedge;
    if(visited[v2]==1) FLAG=1;
    while(p)
    {
        if(visited[p->adjvex]==0)//并不是单独的一个adjvex,而是随p而变的adjvex
        DFS(G,p->adjvex,v2);
        p=p->next;
    }
}
int DFSTraverse(LGraph *G,int v1,int v2)
{
    int i;
    for(i=1;i<=(G->nodenum);i++)//首先都初始化为未访问过的状态,本题中下标从1开始
    {
        visited[i]=0;
    }
        DFS(G,v1,v2);//从v1点开始深度搜索
    return FLAG;
}

4.哨兵数组visited【105】

头插法在本题的使用:

 代码:

#include <stdio.h>
#include <stdlib.h>
int visited[105];
typedef struct EdgeNode//边点
{
    int adjvex;
    struct EdgeNode *next;
}edge;
typedef struct vertexnode//顶点
{
    int data;
    edge* firstedge;
}vertexnode,Adjlist[105];
typedef struct LGraph//图
{
    int edgenum,nodenum;
    Adjlist adjlist;
}LGraph;
LGraph* creategraph( )//创建图
{
    LGraph*G=(LGraph*)malloc(sizeof(LGraph));
    scanf("%d %d\n",&(G->nodenum),&(G->edgenum));
    int i,j;
    for(i=1;i<=(G->nodenum);i++)//填充顶点表
    {
        int temp;
        scanf("%d",&temp);
        G->adjlist[temp].data=temp;//顶点表下标是输入的temp而不是i!
        G->adjlist[temp].firstedge=NULL;//勿漏
    }
    for(j=1;j<=(G->edgenum);j++)//填充边表
    {
        int temp1,temp2;
        scanf("%d %d\n",&temp1,&temp2);//读入有向边的”入“,”出“
        edge*e=(edge*)malloc(sizeof(edge));
        e->adjvex=temp2;
        e->next=G->adjlist[temp1].firstedge;//头插法!!!!
        G->adjlist[temp1].firstedge=e;
        //e->adjvex=temp2;
        //e->next=G->adjlist[temp1].firstedge->next;//为什么不行?firstedge都初始化为NULL!同时尾插法不合适本题
       //G->adjlist[temp2].firstedge->next=e;
    }
    return G;
}
int FLAG=0;//判断是否能通过v2的标志,全局变量
void DFS(LGraph*G,int adjvex,int v2)//深度搜索
{
    edge*p;
    visited[adjvex]=1;//标记已经访问过
    p=G->adjlist[adjvex].firstedge;
    if(visited[v2]==1) FLAG=1;
    while(p)
    {
        if(visited[p->adjvex]==0)//并不是单独的一个adjvex,而是随p而变的adjvex
        DFS(G,p->adjvex,v2);
        p=p->next;
    }
}
int DFSTraverse(LGraph *G,int v1,int v2)
{
    int i;
    for(i=1;i<=(G->nodenum);i++)//首先都初始化为未访问过的状态,本题中下标从1开始
    {
        visited[i]=0;
    }
        DFS(G,v1,v2);//从v1点开始深度搜索
    return FLAG;
}

int main()
{
    LGraph*G;
    G=creategraph();
    int v1,v2,flag=0;
    scanf("%d %d",&v1,&v2);//要寻找的路径的两端下标
    flag=DFSTraverse(G,v1,v2);
    if(flag==1)
        printf("yes");
    else
        printf("no");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值