本博文源于浙江大学《数据结构》,题目源于pta。这个六度空间还是讲的比007更仔细的。下面先放出题目:
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。

图1 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。

假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。

输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤10^3,表示人数)、边数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%

分析

如何做出这道题目?姥姥说这是一道广度优先搜索的题目,列出联通集?这道题目做完没?有一部分代码可以从联通集里参考的,所以我们想办法实现后面六度空间的验证。当然最难的是如何判定?

void BFS(int s) {int Q[MAXN],front = 0,rear = 0,v,i;int tail,last = s,cnt = 0,level = 0,kase = s;Vertex p;double perc;Q[++rear] = s;visit[s] = 1;cnt ++;while(rear!=front) {v = Q[++front];for(p = G->Head[v].FirstEdge;p;p = p->Next) {if(!visit[p->V]) {Q[++rear] = p->V;visit[p->V] =1;cnt ++;tail = p->V;}}if(v==last) {level ++;last = tail;}if(level == 6) break;}perc = ((double)cnt)/((double)G->Nv) * 100;printf("%d: %.2lf%%\n",kase,perc);
}

在广度优先搜索里做手脚,跟着姥姥的视频慢慢把这部分实现,附上我听课的截图

一边看着视频,再把博主的代码分析,就更佳的。我一般听视频要听三遍以上。第一遍是课程刚发布我去听,听的是预习。第二遍听是听他的操作集如何实现。第三遍听是练习如何做。因此哈,图论的基本操作还是灵活和死板的。灵活在题目多种多样,死板在深搜和广搜总令人满意。变化就在广搜和深搜的条件。

最后还要提一下博主用邻接表+数组模拟队列实现,希望大家也能掌握,毕竟在考甲级或乙级这些简短的代码可以更好地帮程序的桩打起来!


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 10005typedef struct VNode* Vertex;
struct VNode {Vertex Next;int V;
};//邻接表创建Vertextypedef struct LNode {Vertex FirstEdge;}List[MAXN];typedef struct GNode* Graph;
struct GNode {int Nv,Ne;List Head;
};Graph G;//邻接表插入结点,大家都要懂得!
void Insert(int v,int w) {Vertex NewNode = (Vertex)malloc(sizeof(struct VNode));NewNode->V = v;NewNode->Next = G->Head[w].FirstEdge;G->Head[w].FirstEdge = NewNode;NewNode = (Vertex) malloc(sizeof(struct VNode));NewNode->V = w;NewNode->Next = G->Head[v].FirstEdge;G->Head[v].FirstEdge = NewNode;
}int visit[MAXN];void BFS(int s) {int Q[MAXN],front = 0,rear = 0,v,i;int tail,last = s,cnt = 0,level = 0,kase = s;Vertex p;double perc;Q[++rear] = s;visit[s] = 1;cnt ++;while(rear!=front) {v = Q[++front];for(p = G->Head[v].FirstEdge;p;p = p->Next) {if(!visit[p->V]) {Q[++rear] = p->V;visit[p->V] =1;cnt ++;tail = p->V;}}if(v==last) {level ++;last = tail;}if(level == 6) break;}perc = ((double)cnt)/((double)G->Nv) * 100;printf("%d: %.2lf%%\n",kase,perc);
}
int main()
{int i;int v,w;G = (Graph)malloc(sizeof(struct GNode));scanf("%d%d",&G->Nv,&G->Ne);for(i=1;i<=G->Nv;i++)G->Head[i].FirstEdge = NULL;for(i=1;i<=G->Ne;i++) {scanf("%d%d",&v,&w);Insert(v,w);}for(i=1;i<=G->Nv;i++) {memset(visit,0,sizeof(visit));BFS(i);}return 0;}

(c语言详解)06-图3 六度空间 (30分)(详细解释)相关推荐

  1. linux中ping命令详解,linux中的ping命令的详细解释

    linxu下的ping命令的主要功能就是确定网络状态,下面由秋天网 Qiutian.ZqNF.Com小编为大家整理了linux的ping命令的详细解释的相关知识,希望对大家有帮助! 一.linux中的 ...

  2. linux中less命令详解,linux中的less命令的详细解释

    linxu下的less命令可以查看文本文件.下面由学习啦小编为大家整理了linux的less命令的详细解释的相关知识,希望对大家有帮助! 一.linux中的less命令的详细解释 less命令语法 l ...

  3. linux中pwd命令详解,linux中的pwd命令的详细解释

    linxu下的pwd命令执行能够立刻知道目前工作目录的路径名称,下面由学习啦小编为大家整理了linux的pwd命令的详细解释的相关知识,希望对大家有帮助! 一.linux中的pwd命令的详细解释 Li ...

  4. Drools 规则语言详解(上)

    http://www.blogjava.net/guangnian0412/archive/2006/06/09/51574.html http://www.blogjava.net/guangnia ...

  5. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  6. 排座系统c语言,2008noip排座位C语言详解.doc

    2008noip排座位C语言详解 2008noip排座位C语言详解 2.排座椅 (seat.pas/c/cpp)D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列 的同学的位置是 ...

  7. 有向图邻接矩阵c语言编程,邻接矩阵有向图(一)之 C语言详解

    本章介绍邻接矩阵有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

  8. 邻接矩阵用c语言,邻接矩阵无向图(一)之 C语言详解

    本章介绍邻接矩阵无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

  9. HTML超文本标记语言详解

    HTML超文本标记语言详解 Hyper Text Markup Language(超文本标记语言) 现在的开发版本一般为HTML5+CSS3 W3C标准:World Wide Web Consorti ...

  10. Quartus II 8.1 详解--有图---图片详解 【1讲】

    Quartus II 8.1  详解--有图---图片详解    看图片比较清楚,比文章清楚的多 本文转自 zhangguangyi 51CTO博客,原文链接http://blog.51cto.com ...

最新文章

  1. 漫画:程序教你玩转股票
  2. 小巫新闻客户端底部菜单切换实现
  3. 文巾解题 596. 超过5名学生的课
  4. 深入Java集合学习系列:ArrayList的实现原理
  5. 【虚拟化】docker安装ElasticSearch+Kibana,下载IK分词器
  6. c++引用专题之普通引用
  7. 通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记
  8. System.Timers.Timer 与 System.Threading.Timer 小间隔
  9. 基于16QAM调制的OFDM系统仿真实现(MATLAB)
  10. win10不用密码登录及不显示“要使用本计算机,用户必须输入用户名和密码”的解决办法
  11. html如何制作图片蒙版,如何制作遮罩蒙版手机照片?详细图文教程
  12. 抱薪者说 | 从零开始 ,社区年会诞生记
  13. python spacy 安装超时_安装spacy失败
  14. 如何在A4纸上排版多个二维码?
  15. T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式
  16. 【docker系列】docker API管理接口增加CA安全认证
  17. java jdk 1.8中lambda表达式常用方法
  18. 服务器设计之SEDA架构
  19. Tailwind教程2 - 基础样式
  20. Noip2016PJ复赛总结

热门文章

  1. 让DeepLearning4j阅读小说并给出关联度最高的词
  2. 一个真实的Windows XP SP 3镜像包 571MB大小
  3. iWebShop核心团队启动shukai新域名,进入全案SEO网络营销领域发力SEO众包外包服务
  4. ipersistfile save 失败 错误代码“0x80070005” 拒绝访问的解决办法
  5. cisco思科交换机的基本使用
  6. 2017个人年终总结
  7. 国内的9家域名顶级注册商
  8. 清华大学计算机2021研究生录取分数线,清华大学2021年研究生录取分数线多少分...
  9. 关于机器人方面的sci论文_科学网-2014年SCI收录机器人期刊22种目录-万跃华的博文...
  10. 字节大幅压缩了22~23年的招聘