目录

  • 题目描述
  • 代码
  • 解题思路

题目描述

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。

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

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

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

代码

#include<stdio.h>
#include<malloc.h>#define MaxVertexNum 1000
#define MaxEdgeNum 33
int visited[MaxVertexNum+1] = {0};
typedef int Vertex;
typedef int WeightType;
typedef char DataType;/* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{Vertex V1, V2;     /* 有向边 *///WeightType Weight; /* 权重,本题不需要使用 */
};
typedef PtrToENode Edge;/* 邻接点的定义 */
typedef struct AdjVnode *PtrToAdjVnode;
struct AdjVnode{Vertex AdjV;  /* 邻接点下标 *///WeightType Weight;  /* 边权重,本题不需要使用 */PtrToAdjVnode Next; /*指向下一个邻接点的指针*/
};/* 顶点表头结点的定义 */
typedef struct Vnode{PtrToAdjVnode FirstEdge;  /* 边表头指针 *///DataType Data;          /* 存顶点的数据,本题不需要出现*/
}AdjList[MaxVertexNum+1];       /* 定义顶点表头结点的数组 *//* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{int Nv;   /* 顶点数 */int Ne;   /* 边数   */AdjList G;/* G是顶点表头结点数组 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */LGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */Vertex V;LGraph Graph;Graph = (LGraph)malloc(sizeof(struct GNode));Graph->Nv = VertexNum;Graph->Ne = 0;/* 初始化邻接表头指针 */for (V=1; V<=Graph->Nv; ++V)Graph->G[V].FirstEdge = NULL;return Graph;
}void InsertEdge( LGraph Graph, Edge E )
{PtrToAdjVnode NewNode;/* 插入边 *//* 为V2建立新的邻接点 */NewNode = (PtrToAdjVnode)malloc(sizeof(struct AdjVnode));NewNode->AdjV = E->V2;//NewNode->Weight = E->Weight;/* 将V2插入V1的表头 */NewNode->Next = Graph->G[E->V1].FirstEdge;Graph->G[E->V1].FirstEdge = NewNode;/* 双向图,将V1插入V2的表头 */NewNode = (PtrToAdjVnode)malloc(sizeof(struct AdjVnode));NewNode->AdjV = E->V1;NewNode->Next = Graph->G[E->V2].FirstEdge;Graph->G[E->V2].FirstEdge = NewNode;
}LGraph BuildGraph()
{LGraph Graph;Edge E;Vertex V;int Nv, Ne, i;scanf("%d",&Nv);Graph = CreateGraph(Nv);scanf("%d",&Graph->Ne);if ( Graph->Ne ){E = (Edge)malloc(sizeof(struct ENode));for(i=0; i!=Graph->Ne; ++i){scanf("\n%d %d",&E->V1,&E->V2);InsertEdge( Graph, E );}}return Graph;
}Vertex Q[MaxVertexNum] = {0};
int First = 1, Last = 0;void Enqueue(Vertex V)
{Q[++Last] = V;
}Vertex Dequeue()
{Vertex V;V = Q[First++];return V;
}
int BFS( Vertex V, LGraph Graph)
{visited[V] = 1;int count = 1, level = 0, last = V, tail;Enqueue(V);while( First<=Last ){V = Dequeue();PtrToAdjVnode Node = Graph->G[V].FirstEdge;while(Node){if ( !visited[Node->AdjV] ){visited[Node->AdjV] = 1;Enqueue(Node->AdjV);++count;tail = Node->AdjV;}Node = Node->Next;}if ( V == last ){++level;last = tail;}if ( level == 6 ) break;}return count;
}void SDS(LGraph Graph)
{int count;double Per;Vertex V, j;for (V=1; V<=Graph->Nv; V++){count = BFS(V, Graph);Per = (float)count / Graph->Nv * 100;printf("%d: %.2f%%\n",V,Per);/* 重新初始化全局变量和队列 */for(j=0;j<=MaxVertexNum;++j)visited[j] = 0;First = 1, Last = 0;}
}int main()
{LGraph Graph = BuildGraph();SDS(Graph);return 0;
}

解题思路

1.判断层数的方法
图中1的所有邻接点依次入队列,关键是判断什么时候这一层的所有结点都出队列了,然后层数加1。方法是使用一个last和tail。在1的邻接点入队列的时候,始终让tail等于最新入队列的结点,最后tail就会指第一层的最后一个结点。让last等于这个tail,则判断出队列的结点是否等于last就能判断这一层是不是出完了。其他层类似。
2.队列和全局变量的重新初始化
定义队列Q[MaxVertexNum]和判断是否访问过结点的数组visited[MaxVertexNum]都是全局变量,第一次使用完之后一定要重新初始化(第149行),否则程序就会出现问题。

六、图(上):六度空间相关推荐

  1. 大连理工版小学计算机教案,小学信息技术教案六年上LOGO 大连理工大学版.docx...

    小学信息技术教案六年上LOGO 大连理工大学版 小学信息技术教案六年上LOGO(大连理工大学版) 1课 走 进oLog 世 目:标1.会学启动L go 系o统 2:.掌 F握DB..KRT.TL.C. ...

  2. 六年级上学期计算机上册教案,六年级上册数学全册教案

    六年级上册数学全册教案 教学目标: 1.在具体的情境中,探索确定位置的方法,能用数对表示物体的位置. 2. 使学生能在方格纸上用数对确定位置. 教学重点:能用数对表示物体的位置. 教学难点:能用数对表 ...

  3. NeurIPS 2021 | 图上不均衡表示学习新视野:基于拓扑结构的不均衡学习

    论文标题: Topology-Imbalance Learning for Semi-Supervised Node Classification 论文链接: https://arxiv.org/ab ...

  4. 学习笔记——【python】GetGeoTransform()使用,gdal截取图像,使用GDAL进行影像投影坐标、地理坐标、图上坐标的转换

    1. GetGeoTransform()使用.gdal截取图像 GetGeoTransform() GeoTransform[0],左上角横坐标(应该是投影坐标) GeoTransform[2],行旋 ...

  5. 数据结构实验六 图的综合应用

    实验六  图的综合应用 一.实验目的 1.掌握图的基本操作-遍历: 2. 掌握图的应用. 二.实验内容 对给定的输入内容,完成实验任务 输入顶点集:1 2 3 4 5 6 7 8 输入边的集合: 1  ...

  6. 数据结构实验六 图的操作实现

    数据结构实验六 图的操作实现 一.实验目的 1. 理解图的存储结构与基本操作: 2. 掌握图的创建过程 二.实验内容 1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵. 图的创建代码参考 ...

  7. python 一张图画多条线_Gnuplot.py在一张图上绘制多条线

    我目前正试图使用gnuplot py从文本文件中绘制多行.我可以分别绘制两条线,但当我试图在同一个图上绘制它们时,它只绘制一条线.在 这是我的代码:#!/usr/bin/env python impo ...

  8. tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...

    为什么有些题目看着复杂,看一眼就想烧了卷子.听老师一讲,然后一个有趣的事情就发生了,原来这么简单,哎哟,这方法不错,老师还挺聪明,给你点个赞. 首先承认一点,大家智商基本没有太大差异,老师也好,学生也 ...

  9. 六年级计算机word处理,六年级上信息技术教案Word大变身用Word制作网页河大版

    <六年级上信息技术教案Word大变身用Word制作网页河大版>由会员分享,可在线阅读,更多相关<六年级上信息技术教案Word大变身用Word制作网页河大版(2页珍藏版)>请在人 ...

最新文章

  1. php mysql预处理_php mysqli扩展之预处理
  2. Raman Kazhamiakin
  3. git和github的关系
  4. java中hashcode作用_Java中hashCode的作用
  5. python处理csv文件列错位_CSV文件分割与列异常处理的python脚本
  6. 小程序和网站中无限滚动的实现
  7. LINE: 在windows上运行原生linux程序 (2) : demo完成
  8. 无法使用SQL login去登陆SQL Server - 'Password did not match'
  9. jspstudy oracle,jspStudy环境下搭建网站
  10. 基于MATLAB的疲劳检测
  11. qpython3手机版教程,qpython3手机版下载
  12. Junit4 initializationError初始化错误 终于解决了!!!
  13. 计算机等级考试ppt怎么做,计算机等级考试PPT教学.ppt
  14. 深度解析!短视频如何成为现象级产品
  15. 【Selenium】控制当前已经打开的 chrome浏览器窗口
  16. MFC edit control动态设置密码
  17. 微信公众号post方法Java_Java HttpClient 如何伪装微信浏览器进行POST请求
  18. Intel无线网卡蓝牙功能失效解决思路分享
  19. S7-1200能不能仿真通信?
  20. Matlab函数功能学习记录(1)

热门文章

  1. jmeter创建快捷方式到桌面
  2. JavaScript实现垃圾分类小游戏教程,附源码!
  3. 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
  4. Android屏幕适配概论:
  5. 2021.08.09【普及组】模拟赛C组比赛总结
  6. vue-cli 创建项目不成功 原因为项目文件夹无node_modules文件 进行npm install不成功解决办法
  7. 新包青天 片尾曲 参人生哲理
  8. C语言中用do while解决阶乘之和问题
  9. 5G无用时代的终结—从iPhone 12系列到vivo 6G应用场景的展望
  10. pyspark中RDD基本操作