7-7 六度空间 (30分)
问题
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。
图1 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。
假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤103,表示人数)、边数M(≤33×N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。
输出格式:
对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
输入样例:
10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
输出样例:
1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00%
解决方法
BFS+邻接矩阵
这个题的意思就是一个图中,找到六圈之内的点数占总点数的比例.难点在于如何控制这个六层.
BFS这种方法实质上就是在BFS的基础上加了三个指针level,last,tail来控制层数.
#include<iostream>
#include<string.h>
#include<queue>
#define MAXN 10000
using namespace std;
int Nv, Ne;
int Visited[MAXN];
int Graph[MAXN][MAXN];
void CreateGraph()
{cin >> Nv >> Ne;for (int i = 0; i < Ne; i++){int x, y;cin >> x >> y;Graph[x][y] = Graph[y][x] = 1;}
}
int BFS(int i)
{queue<int>q;int cnt = 1,level=0,last=i,tail;//level代表层数,last指向每一圈的最后一个点,tail控制last的更新.Visited[i] = 1;q.push(i);while (!q.empty()){int temp = q.front();q.pop();for (int j =1; j <=Nv; j++){if (!Visited[j] && Graph[temp][j]){Visited[j] = 1;q.push(j);cnt++;tail = j;}}if (temp == last)当弹出来的temp等于last的时候,就需要再往外推一层.{level++;last = tail;}if (level == 6) break;}return cnt;
}
int main()
{CreateGraph();for (int i = 1; i <=Nv; i++){cout << i << ": ";memset(Visited, 0, sizeof(Visited));double rate = BFS(i) * 1.0 / Nv * 100;printf("%.2f%%\n", rate);}return 0;
}
后记
想着用DFS也写一下,后来总是出问题,遂放弃o(╥﹏╥)o.这个题以后也要再重新实现一遍.DFS+BFS和邻接矩阵,邻接表,floyed算法,vector这是网上有的答案,需要学习.
7-7 六度空间 (30分)相关推荐
- 7-7 六度空间 (30 分)(BFS遍历详解)(DFS最后一个点过不去)
7-7 六度空间 (30 分) 一:题目: 六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:&quo ...
- **06-图3 六度空间 (30 分)**
06-图3 六度空间 (30 分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:&q ...
- 7-7 六度空间 (30分)_近30年仅6人生涯总决赛首秀得分30+ 浓眉哥能成下一个吗
在竞争激烈的总决赛上要想得到高分并不容易,一个球员在第一次站上总决赛的舞台的时候要想得到高分更不容易,即使是强如勒布朗-詹姆斯在个人NBA生涯的总决赛首秀中也只是得到14分而已.近30年NBA历史上仅 ...
- 7-7 六度空间 (30分)_现役球员中,谁最可能成下一位30000分先生?3大前十巨星没戏...
想要在NBA联盟得到3万分有多难?从联盟成立至今的70多年中,总得分超过3万分的球员一共只有7位,他们分别是贾巴尔.马龙.詹姆斯.科比.乔丹.诺维茨基和张伯伦,剩下的强如大鲨鱼.艾弗森都没能完成这一壮 ...
- PTA_数据结构与算法_7-7 六度空间 (30分)
"六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔 ...
- 7-7 六度空间 (30分) 【最短路径(Floyd)】
题目描述: "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生 ...
- 7-2 六度空间(30 分)
7-2 六度空间(30 分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:" ...
- 05-3. 六度空间 (30)
05-3. 六度空间 (30) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard "六度空间"理论又称作"六度 ...
- 3分和30分文章差距在哪里?
好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...
- 微生物组:3分和30分文章差距在哪里?
好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...
最新文章
- NB-IoT,你真是太让我失望了
- speech codec (G.711, G.723, G.726, G.729, iLBC)
- [scala-spark]5. 伴生类和伴生对象
- 在SQL 语句批量替换数据库字符串的方法
- 组合逻辑与lamda算子的历史 英文
- Apache Subversion command line tools下载地址 svn命令行客户端
- java权限框架_Java高级工程师必备技术栈-由浅入深掌握Shiro权限框架
- python3.7读取csv文件_Python3 读取csv文件
- 【备忘】一段用于在论坛上插入Flash内容的JavaScript代码
- xml规范及xml解析
- SwiftyJSON 对网络请求来的数据进行解析或者转为modul
- Spark学习内容介绍
- linux 光纤网卡 软路由,联想M720Q、光网卡、Pon stick、Openwrt我的完美软路由折腾记...
- Android设备实现语音视频通话
- linux云服务器,内存占用率很高解决方法
- 【编程测试题】头条校招
- 【Windows】联想win10系统截屏快捷键
- 【Niagara Vykon N4 】物联网学习 01 Station创建
- 使用Quartus II9.0验证74161计数器
- 我有好的东西和大家一起分享
热门文章
- oracle的多个exclude,记录一下expdp exclude的用法
- 一文看懂ARM Cortex-M处理器 ARM Cortex-M 处理器家族介绍和比较
- windows平台Emacs单实例原理、设置及右键菜单的添加
- Linux重定向console口控制台,Linux重定向console口控制台(Fedora)
- Ubuntu18.04grub增加console口输出
- 站在商业、技术与人文三叉路口的实体书店
- 开机预读快还是不预读快_启用预读为网页浏览提速
- android 输入法更换_安卓手机怎么更换输入法-安卓手机切换输入法的方法 - 河东软件园...
- 3d模型计算机教室,大学教室3d模型
- 非常不错的垃圾删除批处理代码,用了10年不用安装清理软件