当前位置: 首页 > article >正文

PTA数据结构作业四

7-10 判断两点之间是否存在路径

本题要求输出两个顶点之间是否存在路径

输入格式:

输入包括两部分,第一部分是邻接矩阵表示方法中对应1的两个顶点,用0 0 表示结束
第二部分是两个顶点,例如 Vi和Vj

输出格式:

如果Vi和Vj存在路径,输出1;否则输出0

输入样例:

0 1
1 0
0 4
4 0
1 4
4 1
1 2
2 1
1 3
3 1
2 3
3 2
4 5
5 4
4 6
6 4
0 0
0 5

输出样例:

1
#include <stdio.h>
#include <stdlib.h>
#define NOT 0

typedef struct GRAPHMATRIX_STRU{
    int size;
    int **graph;
}GraphMatrix;

//创建邻接矩阵并对邻接矩阵初始化 
GraphMatrix* InitGraph(int num){
	int i,j;
    GraphMatrix *graphMatrix=(GraphMatrix*)malloc(sizeof(GraphMatrix));
    graphMatrix->size=num;
    graphMatrix->graph=(int**)malloc(sizeof(int*)*graphMatrix->size);
    for(i=0;i<graphMatrix->size;i++){
    	graphMatrix->graph[i]=(int*)malloc(sizeof(int)*graphMatrix->size);
	} 
    for(i=0;i<graphMatrix->size;i++){
		for(j=0;j<graphMatrix->size;j++){
			graphMatrix->graph[i][j]=NOT;
		} 
    }
    return graphMatrix;
}
//存入邻接矩阵信息 
void ReadMatrix(GraphMatrix*graphMatrix){
    int vex1,vex2;
    scanf("%d%d",&vex1,&vex2);
    while(vex1!=0||vex2!=0){//如果输入都是0,则停止存入 
        graphMatrix->graph[vex1][vex2]=1;
        scanf("%d%d",&vex1,&vex2);
    }
}
//使用递归对邻接矩阵进行访问 
void IsOrNot(GraphMatrix *graphMatrix,int *visited,int source){
    int j;
    visited[source]=1;//若i节点被访问到,visited[i]=1
    for(j=0;j<graphMatrix->size;j++){
        if(graphMatrix->graph[source][j]!=NOT&&!visited[j]){
        	IsOrNot(graphMatrix,visited,j);
		} 
    }
}
int main(){
    int num=7;//节点个数可以自己定义,可以改为输入的方式
    int *visited=(int*)malloc(sizeof(int)*num);
    //需要对存储访问的变量初始化
    for(int i=0;i<num;i++){
    	visited[i] = 0;
	}
	int head,tail;
    GraphMatrix *graphMatrix;
    graphMatrix=InitGraph(num);
    ReadMatrix(graphMatrix);
    scanf("%d%d",&head,&tail);//判断head节点和tail节点是否来连通
    IsOrNot(graphMatrix,visited,head);
    //printf("%d\n",graphMatrix->graph[3][2]);
    if(visited[tail]==1){//若head节点和tail节点连通,则输出1,否则输出0;
    	printf("1");
	}
    else{
    	printf("0");
	}
    return 0;
}

7-11 判断一个有向图是否存在回路

本题要求编程判断一个有向图是否存在回路

输入格式:

输入是有向图的邻接矩阵表示中的1的相邻顶点,以-1 -1 结束

输出格式:

如果存在回路,输出1,否则输出0

输入样例:

0 3
0 2
0 1
1 5
1 4
1 2
2 5
4 5
5 3
-1 -1

输出样例:

0
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

typedef struct{
	int vexs[MAXSIZE];
	int arc[MAXSIZE][MAXSIZE];
	int numVertexes;
}MGraph;

typedef struct EdgeNode{
	int adjVex;
	int weight;
	struct EdgeNode* next;
}EdgeNode;

typedef struct VertexNode{
	int in;
	int data;
	EdgeNode* firstEdge;
}VertexNode,AdjList[MAXSIZE];

typedef struct GraphAdjList{
	AdjList adjList;
	int vertexNums,edgeNums;
}GraphAdjList;
//构建图 
void CreateMGraph(MGraph *G){
	G->numVertexes = MAXSIZE;
	for(int i=0;i<G->numVertexes;i++){
		G->vexs[i] = i;
	}
	int vex1,vex2;
    scanf("%d%d",&vex1,&vex2);
    while(vex1!=-1||vex2!=-1){//如果输入都是0,则停止存入 
        G->arc[vex1][vex2] = 1;
        scanf("%d%d",&vex1,&vex2);
    }
}

// 利用邻接矩阵构建邻接表
void InitGraphADjList(MGraph *G, GraphAdjList *GL)
{
    GL->vertexNums = G->numVertexes;
    //GL->edgeNums = G->numEdges;

    for (int i = 0; i < G->numVertexes; i++) /* 读入顶点信息,建立顶点表 */
    {
        GL->adjList[i].in = 0;
        GL->adjList[i].data = G->vexs[i];
        GL->adjList[i].firstEdge = NULL; /* 将边表置为空表 */
    }

    for (int i = 0; i < G->numVertexes; i++) /* 建立边表 */
    {
        for (int j = 0; j < G->numVertexes; j++)
        {
            if (G->arc[i][j] == 1)
            {
                EdgeNode *e = (EdgeNode *)malloc(sizeof(EdgeNode));
                e->adjVex = j;                      /* 邻接序号为j  */
                e->next = GL->adjList[i].firstEdge; /* 将当前顶点上的指向的结点指针赋值给e */
                GL->adjList[i].firstEdge = e;       /* 将当前顶点的指针指向e  */
                GL->adjList[j].in++;
            }
        }
    }
}

int TopologicalSort(GraphAdjList *GL)
{
    int count = 0; // 用于统计输出顶点的个数
    // 用于存放入度为0的顶点
    int *stack = (int *)malloc(sizeof(int) * GL->vertexNums);
    int top = 0;
    // 入度为0的顶点入栈
    for (int i = 0; i < GL->vertexNums; i++)
    {
        if (GL->adjList[i].in == 0)
        {
            stack[++top] = i;
 

http://www.kler.cn/a/460420.html

相关文章:

  • 禁用div的写法(自定义disabled)Vue3
  • 鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理
  • 第十四届蓝桥杯Scratch省赛中级组—智能计价器
  • Linux C/C++编程-获得套接字地址、主机名称和主机信息
  • 【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)
  • 【CSS in Depth 2 精译_099】17.5:基于页面滚动的动画时间线设置(全新)+ 17.6:最后一点建议 + 17.7:本章小结
  • 12.31【Linux】shell脚本【运行方式,修改环境变量,数组】思维导图 内附练习
  • Nginx1.20.2-Linux-安装
  • Jenkins 使用入门教程
  • 聊天机器人Rasa面试内容整理-Rasa 是什么?
  • VR动感单车身心调适系统产品特点
  • YK人工智能(三)——万字长文学会torch深度学习
  • vue3中开发一个不定高的虚拟滚动组件
  • SpringBoot + Thymeleaf + Bootstrap5 整合 MyBatis-Plus 和 MySQL 实现动态分类标签渲染教程
  • 郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现
  • 深信服云桌面系统的终端安全准入设置
  • JavaWeb开发(三)Servlet技术-手动、自动创建Servlet
  • Elasticsearch-搜索推荐:Suggest
  • 记一次 .NET某汗液测试机系统 崩溃分析
  • HTML5 开关(Toggle Switch)详细讲解
  • 如何将联系人从 iPhone 转移到华为 [4 种方法]
  • 【SQLi_Labs】Basic Challenges
  • 网络游戏之害
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2
  • 半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习
  • 机器学习DAY9:聚类(K-means、近邻传播算法、谱聚类、凝聚聚类、兰德指数、调整互信息、V−mearure、轮廓系数)