首页 > 编程语言 >邻接矩阵的算法设计

邻接矩阵的算法设计

时间:2023-05-22 16:32:01浏览次数:41  
标签:typedef arcs int 出度 printf 邻接矩阵 算法 顶点 设计

题目描述

假设图G采用邻接矩阵存储,分别设计实现以下要求的算法:

1.输出每个顶点的入度

2.输出每个顶点的出度

3.求出度最大的一个顶点,输出其编号

4.计算图中出度为0的顶点数

5.判断图中是否有边<i,j> 

解决思路

1.入度是邻接矩阵中第i列的元素之和

在函数InDegree()中,我们需要设置一个循环来遍历所有的结点,计算出每个结点的入度,并输出结果。在输出每个顶点的入度时,应该输出顶点的编号,而不是顶点的名称。在主函数中,调用InGegree()函数时,传入的也是顶点的编号,而不是顶点的名称。

2.求每个顶点的出度和求入度类似,求出度和行有关,求入度和列有关。

3.4.5我用的都是标志大法~~~~~

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"my.h"
#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef int VRType;
typedef char InfoType;
typedef char VertexType [10];
typedef struct ArcCell
{
	VRType adj;
	InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
	VertexType vexs[MAX_VERTEX_NUM];
	AdjMatrix arcs;
	int vexnum,arcnum;
	GraphKind Kind;
}MGraph;
int LocateVex(MGraph G,VertexType v)
{
	int i;
	for(i=0;i<G.arcnum;i++)
		if(!strcmp(G.vexs[i],v))
			return i;
	return -1;
}
Status CreateUDN(MGraph *G)
{
	int i,j,k;
	char v1[20],v2[20];
	printf("请输入顶点和弧的个数:");
	scanf("%d%d",&G->vexnum,&G->arcnum);
	for(i=0;i<G->vexnum;i++)
		scanf("%s",G->vexs[i]);
	for(i=0;i<G->vexnum;i++)
		for(j=0;j<G->vexnum;j++)
		{
			G->arcs[i][j].adj=0;
			G->arcs[i][j].info=NULL;
		 }
		printf("请输入边依附的顶点:\n"); 
	for(k=0;k<G->arcnum;k++)
	{
		scanf("%s%s",&v1,&v2);
		i=LocateVex(*G,v1);
		j=LocateVex(*G,v2);
		G->arcs[i][j].adj=G->arcs[j][i].adj=1;
	}
}
void InDegree(MGraph G)
{
	int i;
	int j;
	for(i=0;i<G.vexnum;i++)
	{
		int count=0;
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[j][i].adj==1)
				count++;
		}
		printf("%s的入度为%d\n",G.vexs[i],count);
	}
}
void OutDegree(MGraph G)
{
	int i,j;
	for(i=0;i<G.vexnum;i++)
	{
		int count=0;
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[i][j].adj==1)
				count++;
		}
		printf("%s的出度为%d\n",G.vexs[i],count);
	}
}

void MaxOutDegree(MGraph G)
{
    int i,j;
	int max=-1;
	int *p;
    for(i=0;i<G.vexnum;i++)
    {
        int count=0;
        for(j=0;j<G.vexnum;j++)
        {
            if(G.arcs[i][j].adj==1)
                count++;
        }
        if(count > max)
        {
            max = count;
            *p= i+1;
        }
    }
    printf("出度最大的顶点编号为:%d\n", *p);
}
void zerooutDegree(MGraph G)
{
	int i,j,count=0;
	for(i=0;i<G.vexnum;i++)
	{
		int flag=1;
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[i][j].adj==1)
			{
				flag=0;
				break;
			}
		}
		if(flag)
			count++;
	}
	printf("出度为0的顶点数为%d\n",count);
}
void hasEdge(MGraph G)
{
    int i, j;
    int flag = 0; // 标记是否找到边

    printf("请输入要查询的边<i,j>:");
    scanf("%d%d", &i, &j);

    if (i <= 0 || i > G.vexnum || j <= 0 || j > G.vexnum) {
        printf("输入的顶点编号不合法!\n");
        return;
    }

    if (G.arcs[i-1][j-1].adj== 1) {
        printf("存在边<v%d,v%d>。\n", i, j);
        flag = 1;
    }

    if (!flag) {
        printf("不存在边<v%d,v%d>。\n", i, j);
    }
}

int main()
{
	MGraph G;
	int i,j;
	CreateUDN(&G);
	printf("建立的邻接矩阵为:\n");
	for(i=0;i<G.vexnum;i++)
	{
		for(j=0;j<G.vexnum;j++)
			printf("%3d",G.arcs[i][j].adj);
		printf("\n");
	}
	InDegree(G);
	printf("\n");
	OutDegree(G);
	printf("\n");
	MaxOutDegree(G);
	printf("\n");
	zerooutDegree(G);
	printf("\n");
	hasEdge(G);
	printf("\n");
}

邻接矩阵的算法设计_邻接矩阵

标签:typedef,arcs,int,出度,printf,邻接矩阵,算法,顶点,设计
From: https://blog.51cto.com/heliotopekxy/6325553

相关文章

  • DDD领域驱动设计
    本文源于最近学习实践DDD相关知识的自我总结。相关内容源于网络本文部分引用1、钟敬老师极客时间的DDD课程——手把手教你落地DDD2、欧创新老师极客时间的DDD课程——DDD实战课一、DDD基本开发过程1、捕获行为需求识别需求流程、功能、参与者、功能结......
  • 程序与设计
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运......
  • 裴波那契数列的递归和动态规划算法
    裴波那契数列的递归和动态规划算法一、   概论通过对裴波那契数列的例子,分析了递归和动态规划算法的本质。并且说明了两种算法的区别。裴波那契数列:800年前,意大利的数学家斐波纳契出版了惊世之作《算盘书》。在《算盘书》里,他提出了著名的“兔子问题”:假定一对兔子每个月可......
  • 页面置换算法的c语言实现
    #include<bits/stdc++.h>usingnamespacestd;intn;//物理块号数intlen,op;//进程数inta[100];//存储进程执行的先后顺序;intres[100][100];//存放进程执行的结果数组intoptfind[100],optflag[100];intlruflag[1000];intnru_value[100],nru_r[100],nru_m[100];voidprint......
  • java通用xls导出设计
    背景在后端日常开发中总会有各种各样的导出需求,实现这个需求必须要解决的两个问题:1、表头不能直接使用字段名,需要显示为中文,甚至还需要考虑国际化2、值需要翻译,比如性别、状态之类的字段现状现在主流写的比较好的方法是定义一个对象,对象上用自定义的注解+easytrans我的解决......
  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347. 前 K 个高频元素
    【参考链接】239.滑动窗口最大值【注意】 1.使用单调队列的经典题目。2.大顶堆每次只能弹出最大值,无法移除其他数值,造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。3.需要一个队列,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉......
  • 【实践篇】领域驱动设计:DDD工程参考架构
    背景为什么要制定参考工程架构不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构风格,有些在实践中可能引入CQRS解决读模型与......
  • BOSHIDA电源模块 开关电源磁性元件设计 了解磁学
    BOSHIDA电源模块开关电源磁性元件设计了解磁学对于许多电气工程师来说,磁学相关的理论通常晦涩难懂,大家发现。在导体中描述电流流动是相对比较容易的,但是难以直观地想象电流发出的磁场。结果就是,许多磁性元件设计被“外包”给其他部门的“专家”,他们可能是来自于公司内部的另一个......
  • 基于C++实现房贷计算器的设计
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]本次项目的要求是完成一个房贷计算器的设计,实现商业贷款、公积金贷款和组合贷款的利息计算三种功能。并且使用Qt或其他的界面库设计人机交互界面,要求界面友好方便使用。并且必须使用面向对象的思想进行设计,使用C++编程。1.题目要求......
  • c语言程序设计知识点总结03
    c语言程序设计知识点总结03地址(Address):计算机的内存由若干个字节内存单元构成,每个字节内存单元都有一个唯一的地址用于区分和存取单元中的数据。形式上,地址是一个无符号整数,从0开始,依次递增,在表达和交流时,通常把地址写成十六进制数。指针(Pointer):一个变量,它存有另外一......