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

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

问题描述

“六度空间”理论又称作“六度分隔(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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一