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

【PTA数据结构 | C语言版】验证六度空间理论

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

所谓“六度空间理论”是指:在世界上任何两个陌生人之间所间隔的人数不会超过 6 个。本题就请你编写程序,根据输入的人与人之间的关系,统计以某个人为起点的所有满足该理论(即与该起点之间间隔的人数不超过 6 个)的人数,并且计算这个人数在总人数中的占比。

输入格式:
输入首先在第一行给出可能参与统计的最大人数,即正整数 kMaxVertex(≤10^3)。
第二行给出两个正整数,依次为当前参与统计的人数 n 和人际关系数 m(保证 n 至少为 2 且不超过最大人数,m 不超过 33n)。
随后 m 行,每行给出两个直接认识的人的编号(从 0 开始)。
最后给出起点人的编号 v。
同行数字、字符均以一个空格分隔。

输出格式:
在一行中输出以 v 为起点的所有满足“六度空间理论”的人数在总人数中的占比,格式为 x.yy%,即输出小数点后 2 位。

输入样例:
20
20 19
0 1
0 2
2 3
4 5
5 6
6 7
7 8
8 9
9 10
10 11
4 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
5 14
4

输出样例:
70.00%

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_VERTEX 1000// 图结构定义 - 使用邻接矩阵表示
typedef struct {int adj[MAX_VERTEX][MAX_VERTEX]; // 邻接矩阵int n;                           // 顶点数
} Graph;// 队列结构 - 用于广度优先搜索
typedef struct {int data[MAX_VERTEX];int front, rear;
} Queue;// 初始化队列
void initQueue(Queue *q) {q->front = q->rear = 0;
}// 检查队列是否为空
int isQueueEmpty(Queue *q) {return q->front == q->rear;
}// 入队操作
void enqueue(Queue *q, int v) {q->data[q->rear++] = v;
}// 出队操作
int dequeue(Queue *q) {return q->data[q->front++];
}// 初始化图
void initGraph(Graph *g, int n) {g->n = n;// 初始化邻接矩阵所有元素为0for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {g->adj[i][j] = 0;}}
}// 添加无向边
void addEdge(Graph *g, int u, int v) {g->adj[u][v] = 1;g->adj[v][u] = 1;
}// BFS实现 - 计算从顶点v出发,距离不超过6的顶点数
int bfs(Graph *g, int v) {int visited[MAX_VERTEX] = {0}; // 标记顶点是否被访问int level[MAX_VERTEX] = {0};   // 记录顶点距离起点的层数Queue q;initQueue(&q);visited[v] = 1;      // 标记起点为已访问enqueue(&q, v);      // 起点入队int count = 1;       // 至少包含起点自身while (!isQueueEmpty(&q)) {int u = dequeue(&q); // 取出队首顶点// 如果当前层数已经达到6,不再继续扩展if (level[u] >= 6) continue;// 逆序遍历邻接顶点 - 确保与输入顺序一致for (int i = g->n - 1; i >= 0; i--) {// 如果存在边且未被访问if (g->adj[u][i] && !visited[i]) {visited[i] = 1;            // 标记为已访问level[i] = level[u] + 1;   // 层数加1enqueue(&q, i);            // 入队count++;                   // 计数加1}}}return count; // 返回距离不超过6的顶点总数
}int main() {int kMaxVertex;scanf("%d", &kMaxVertex);int n, m;scanf("%d %d", &n, &m);Graph g;initGraph(&g, n);// 读取边信息,构建邻接矩阵for (int i = 0; i < m; i++) {int u, v;scanf("%d %d", &u, &v);addEdge(&g, u, v);}int v;scanf("%d", &v); // 读取起点编号// BFS计算满足条件的顶点数int count = bfs(&g, v);// 计算比例并输出,保留两位小数double ratio = (double)count / n * 100;printf("%.2f%%\n", ratio);return 0;
}    
http://www.lryc.cn/news/594935.html

相关文章:

  • Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录
  • Hadoop数据完整性校验机制深度解析:CRC32校验和与后台扫描线程
  • 低空经济展 | 约克科技携小型化测试设备亮相2025深圳eVTOL展
  • Spring Boot 3核心技术面试指南:从迁移升级到云原生实战,9轮技术攻防(含架构解析)
  • 树链剖分-苹果树
  • EMBMS1820芯祥科技18单元电池监控器芯片数据手册
  • 有关Spring的总结
  • 网络编程之 UDP:用户数据报协议详解与实战
  • 19.TaskExecutor与ResourceManager建立连接
  • Openlayers 面试题及答案180道(161-180)
  • 线上问题排查之【CPU飙高100%】
  • 在幸狐RV1106板子上用gcc14.2本地编译安装mysql-8.0.42数据库
  • 一维DP深度解析
  • ElasticSearch是什么
  • 如何使用Ansible一键部署Nacos集群?
  • Android 蓝牙通讯全解析:从基础到实战
  • 【STM32】485接口原理
  • 元图 CAD:PDF 与 CAD 格式互转的完美解决方案
  • 部署 Zabbix 企业级分布式监控
  • WPF 初始界面启动时播放背景音乐
  • 合并pdf工具下载
  • Redis进阶--缓存
  • 如何使用python网络爬虫批量获取公共资源数据
  • 微软CEO Satya Nadella提出AI重构法则:从范式跃迁到社会盈余
  • 本地生活服务 app 同城信息发布系统搭建
  • delphi disqlite3 操作sqlite
  • C# 计算梯形面积和周长的程序(Program to calculate area and perimeter of Trapezium)
  • 在Windows Server 2012 R2中安装与配置IIS服务并部署mssql靶机教程
  • 【世纪龙科技】新能源汽车概论-汽车教学数字课程资源
  • 如何编写假设和约束---SRS软件需求规格指南系列