数据结构实验任务七:基于广度优先搜索的六度空间理论验证

本文主要是介绍数据结构实验任务七:基于广度优先搜索的六度空间理论验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论 可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是 说,最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图, 请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。 输入要求 多组数据,每组数据 m+1 行。第一行有两个数字 n 和 m,代表有 n 个人和 m 组朋友关系。n 个人的编号为 1 到 n。第二行到第 m+1 行每行包括两个数字 a 和 b,代表这两个人互相认识。当 n 和 m 都等于 0 时,输入结束。 输出要求 每组数据输出 n 行,对每个结点输出与该结点距离不超过 6 的结点数占结点 总数的百分比,精确到小数点后 2 位。每个结节点输出一行,格式为“结点编号:(空 格)百分比%”

运行结果:

代码实现:

#include <stdio.h>
#include <stdlib.h>
#define MaxS 20
#define MaxE 5
//结构体部分
typedef struct{						//图结构体定义 char vex[MaxS];					//顶点数组 int vexnum;						//顶点个数 int mat[MaxS][MaxS];			//邻接矩阵 int arcnum;						//边数 
}Graph;
typedef struct{int head,tail;int mat[20];						//队列数组 
}Queue;
//全局变量部分
float result[MaxE][MaxS];					//结果存储函数
int cunt;							//用于全局变量遍历 
int state[MaxS];
//函数声明部分
void Init(Graph *a);
int Read(Graph *a);
void Cal(Graph *a);
void show();
float BFS(Graph *a,int s);
void InitQ(Queue *q);				//初始化队列 
void push(Queue* q,int n);			//入队 
int pop(Queue *q);					//出队 
//函数定义部分
void InitQ(Queue *q){q->head=0;q->tail=0;
}
void push(Queue* q,int n){q->mat[q->tail] = n;q->tail++;
}
int pop(Queue* q){q->head++;if(q->head>q->tail)return -1;return q->mat[q->head-1];
}
float BFS(Graph *a,int s){int tmp,rs=0;int *len=(int*)malloc(sizeof(int)*a->vexnum+1);			//记录到s的距离 for(int i=0;i<=a->vexnum;i++){state[i] = 0;len[i] = 0;}Queue* q = (Queue*)malloc(sizeof(Queue));InitQ(q);push(q,s);state[s]=1;for(int i = 0;i<a->vexnum;i++){						//总共遍历a->vexnum次tmp = pop(q);if(tmp==-1)continue;for(int j=1;j<=a->vexnum;j++){					//每次扫描vexnum个数  if(a->mat[tmp][j]==1&&state[j]==0){len[j] = len[tmp]+1;state[j] = 1;							//状态变成已访问push(q,j);continue;}}}for(int i=1;i<=a->vexnum;i++){if(len[i]<=6&&len[i]!=0)rs+=1;}for(int i=1;i<=a->vexnum;i++){}free(len);free(q);return (float)(rs+1)/a->vexnum*100;
}
void show(){printf("\n                  =================|    -FZC-    |===============                 \n\n");									printf("FOLLOWING OUTPUT:\n");for(int i=0;i<cunt;i++){printf("[EXP %d ]\n",i+1);for(int j=1;j<MaxS;j++){if(result[i][j]==-1)break;printf("%d: %.2f%%\n",j,result[i][j]);}}
} 
void Init(Graph *a){a->arcnum=0;a->vexnum=0;for(int i=0;i<MaxS;i++){a->vex[i] =0;state[i] = 0;result[cunt][i] = -1;for(int j=0;j<MaxS;j++){a->mat[i][j] = 0;}}}int Read(Graph *a){int n,m,s,e;printf("input n,m:");scanf("%d %d",&n,&m);if(n==0&&m==0)return 1;			//若均为0则返回1 a->vexnum = n;a->arcnum = m;printf("input relationship:\n");for(int i=0;i<m;i++){scanf("%d %d",&s,&e);a->mat[s][e] = 1;a->mat[e][s] = 1; }printf("边输入完成;共%d条\n",a->arcnum);return 0; 
}
void Cal(Graph *a){for(int i=1;i<=a->vexnum;i++){result[cunt][i] = BFS(a,i);}printf("\nSuccess!\n");cunt++; 
}
//主函数部分 
int main(){int flag = 0; Graph* a=(Graph*)malloc(sizeof(Graph));cunt=0;printf("多组数据,每组数据 m+1 行。第一行有两个数字 n 和 m,代表有 n 个人和m 组朋友关系。\nn 个人的编号为 1 到 n。\n第二行到第 m+1 行每行包括两个数字 a和 b,代表这两个人互相认识。\n当 n 和 m 都等于 0 时,输入结束。");while(1){//初始化Init(a);printf("\n                  =================|    -FZC-    |===============                 \n\n");//读取数据flag = Read(a);if(flag==1){show();				//输出结果break; }//处理数据Cal(a); }printf("程序结束!\n"); return 0;
}

这篇关于数据结构实验任务七:基于广度优先搜索的六度空间理论验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466976

相关文章

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删