判断从x城市到有没有到达y城市的安全路径

题目:判断从x城市到有没有到达y城市的安全路径
在这里插入图片描述
代码:

#include <stdio.h>
#define MaxVerNum 100

typedef struct MGraph{                       //邻接矩阵定义
    int Vex[MaxVerNum];
    int Edge[MaxVerNum][MaxVerNum];          //存储城市道路的联通情况
    int vexnum,arcnum;
}MGraph;

typedef enum {false,true} bool;

void DFS(MGraph G,int v);
bool DFS_Traverse(MGraph G,int x,int y);
int FirstAdjVex(MGraph G,int v);
int NextAdjVex(MGraph G,int v,int w);
void CreateUGraph(MGraph *G);
void visit(MGraph G,int v);
int LocateVex(MGraph *G,int v);

bool visited[MaxVerNum];

int main()
{
    int x,y,v1,v2;
    bool result;
    MGraph G;
    printf("Enter data to create Graph:\n");
    CreateUGraph(&G);
    printf("Enter begin vertex and end vertex:");
    scanf("%d%d",&x,&y);
    v1=LocateVex(&G,x);
    v2=LocateVex(&G,y);
    result=DFS_Traverse(G,v1,v2);
    printf("\n");
    if(result){
        printf("%d到%d存在一条安全路径",x,y);
    }else{
        printf("%d到%d没有安全路径!",x,y);
    }
    return 0;
}

int FirstAdjVex(MGraph G,int v){         //查找与数组下标V有边相连的第一个顶点,返回它在数组中的下标
    for(int i=v;i<G.vexnum;i++){
        if(G.Edge[v][i]){
            return i;
        }
    }
    return -1;
}

int NextAdjVex(MGraph G,int v,int w){   //从前一个访问的w结点的下标开始访问与结点v有边相连的顶点,返回其数组下标
    for(int i=w+1;i<G.vexnum;i++){
        if(G.Edge[v][i]==1){
            return i;
        }
    }
    return -1;
}

void visit(MGraph G,int v){
    printf("%d ",G.Vex[v]);
}

int LocateVex(MGraph *G,int v){
	int i=0;
	for(;i<G->vexnum;i++){
		if(G->Vex[i]==v){
			break;
		}
	}
	return i;
}

void DFS(MGraph G,int v){
    visit(G,v);
    visited[v]=true;
    for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
        if(!visited[w]){                                     //寻找未访问过的结点继续进行DFS
            DFS(G,w);
        }
    }
}

bool DFS_Traverse(MGraph G,int x,int y){
    for(int v=0;v<G.vexnum;++v){
        visited[v]=false;
    }
    DFS(G,x);
    if(!visited[y]){
            return false;
    }else{
        return true;
    }
}

void CreateUGraph(MGraph *G){
    int v1,v2;
    printf("Enter vertex number and adjacent number:");
    scanf("%d%d",&(G->vexnum),&(G->arcnum));
    printf("Enter vertex:");
    for(int i=0;i<G->vexnum;i++){
        scanf("%d",&(G->Vex[i]));
    }
    for(int i=0;i<G->vexnum;i++){
        for(int j=0;j<G->vexnum;j++){
            G->Edge[i][j]=0;
        }
    }
    printf("Enter Adjacency list:\n");
    for(int i=0;i<G->arcnum;i++){
        scanf("%d%d",&v1,&v2);
        v1=LocateVex(G,v1);
        v2=LocateVex(G,v2);
        G->Edge[v1][v2]=1;
        G->Edge[v2][v1]=1;
    }
}

练手题目,请多多指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只水熊虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值