六、图(上):六度空间
目录
- 题目描述
- 代码
- 解题思路
题目描述
“六度空间”理论又称作“六度分隔(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行),否则程序就会出现问题。
六、图(上):六度空间相关推荐
- 大连理工版小学计算机教案,小学信息技术教案六年上LOGO 大连理工大学版.docx...
小学信息技术教案六年上LOGO 大连理工大学版 小学信息技术教案六年上LOGO(大连理工大学版) 1课 走 进oLog 世 目:标1.会学启动L go 系o统 2:.掌 F握DB..KRT.TL.C. ...
- 六年级上学期计算机上册教案,六年级上册数学全册教案
六年级上册数学全册教案 教学目标: 1.在具体的情境中,探索确定位置的方法,能用数对表示物体的位置. 2. 使学生能在方格纸上用数对确定位置. 教学重点:能用数对表示物体的位置. 教学难点:能用数对表 ...
- NeurIPS 2021 | 图上不均衡表示学习新视野:基于拓扑结构的不均衡学习
论文标题: Topology-Imbalance Learning for Semi-Supervised Node Classification 论文链接: https://arxiv.org/ab ...
- 学习笔记——【python】GetGeoTransform()使用,gdal截取图像,使用GDAL进行影像投影坐标、地理坐标、图上坐标的转换
1. GetGeoTransform()使用.gdal截取图像 GetGeoTransform() GeoTransform[0],左上角横坐标(应该是投影坐标) GeoTransform[2],行旋 ...
- 数据结构实验六 图的综合应用
实验六 图的综合应用 一.实验目的 1.掌握图的基本操作-遍历: 2. 掌握图的应用. 二.实验内容 对给定的输入内容,完成实验任务 输入顶点集:1 2 3 4 5 6 7 8 输入边的集合: 1 ...
- 数据结构实验六 图的操作实现
数据结构实验六 图的操作实现 一.实验目的 1. 理解图的存储结构与基本操作: 2. 掌握图的创建过程 二.实验内容 1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵. 图的创建代码参考 ...
- python 一张图画多条线_Gnuplot.py在一张图上绘制多条线
我目前正试图使用gnuplot py从文本文件中绘制多行.我可以分别绘制两条线,但当我试图在同一个图上绘制它们时,它只绘制一条线.在 这是我的代码:#!/usr/bin/env python impo ...
- tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...
为什么有些题目看着复杂,看一眼就想烧了卷子.听老师一讲,然后一个有趣的事情就发生了,原来这么简单,哎哟,这方法不错,老师还挺聪明,给你点个赞. 首先承认一点,大家智商基本没有太大差异,老师也好,学生也 ...
- 六年级计算机word处理,六年级上信息技术教案Word大变身用Word制作网页河大版
<六年级上信息技术教案Word大变身用Word制作网页河大版>由会员分享,可在线阅读,更多相关<六年级上信息技术教案Word大变身用Word制作网页河大版(2页珍藏版)>请在人 ...
最新文章
- php mysql预处理_php mysqli扩展之预处理
- Raman Kazhamiakin
- git和github的关系
- java中hashcode作用_Java中hashCode的作用
- python处理csv文件列错位_CSV文件分割与列异常处理的python脚本
- 小程序和网站中无限滚动的实现
- LINE: 在windows上运行原生linux程序 (2) : demo完成
- 无法使用SQL login去登陆SQL Server - 'Password did not match'
- jspstudy oracle,jspStudy环境下搭建网站
- 基于MATLAB的疲劳检测
- qpython3手机版教程,qpython3手机版下载
- Junit4 initializationError初始化错误 终于解决了!!!
- 计算机等级考试ppt怎么做,计算机等级考试PPT教学.ppt
- 深度解析!短视频如何成为现象级产品
- 【Selenium】控制当前已经打开的 chrome浏览器窗口
- MFC edit control动态设置密码
- 微信公众号post方法Java_Java HttpClient 如何伪装微信浏览器进行POST请求
- Intel无线网卡蓝牙功能失效解决思路分享
- S7-1200能不能仿真通信?
- Matlab函数功能学习记录(1)
热门文章
- jmeter创建快捷方式到桌面
- JavaScript实现垃圾分类小游戏教程,附源码!
- 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
- Android屏幕适配概论:
- 2021.08.09【普及组】模拟赛C组比赛总结
- vue-cli 创建项目不成功 原因为项目文件夹无node_modules文件 进行npm install不成功解决办法
- 新包青天 片尾曲 参人生哲理
- C语言中用do while解决阶乘之和问题
- 5G无用时代的终结—从iPhone 12系列到vivo 6G应用场景的展望
- pyspark中RDD基本操作