06-图3 六度空间

我用DEV-C++测过用例,通过了,可是提交到PAT上全都是段错误,今天是没办法了。花了一整天,叫我写点关于解这题的心得,抱歉,头痛。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <stdbool.h>
  4 #include <string.h>
  5
  6 typedef struct node
  7 {
  8     int v;
  9     struct node * next;
 10 }Node, * pNode;
 11 typedef struct
 12 {
 13     pNode * adjList;
 14     int n;
 15     bool * visited;
 16 }ALGraph, * pALGraph;
 17 typedef struct
 18 {
 19     int * elem;
 20     int front, rear, size;
 21 }Queue, * pQueue;
 22
 23 pALGraph initGraph(int N);
 24 void link(pALGraph pG, int v1, int v2);
 25 void insert(pNode pN, int vv);
 26 int BFS(pALGraph, int vv, int N);
 27 pQueue createQueue(int N);
 28 bool isEmpty(pQueue pQ);
 29 void inQueue(pQueue pQ, int e);
 30 int outQueue(pQueue pQ);
 31
 32 int main()
 33 {
 34 //    freopen("in.txt", "r", stdin); // for test
 35     int i, N, M;
 36     scanf("%d%d", &N, &M);
 37
 38     pALGraph pG;
 39     pG = initGraph(N);
 40     for(i = 0; i < M; i++)
 41     {
 42         int v1, v2;
 43         scanf("%d%d", &v1, &v2);
 44         link(pG, v1, v2);
 45     }
 46     int count;
 47     for(i = 1; i <= N; i++)
 48     {
 49         count = BFS(pG, i, N);
 50         printf("%d: %.2f%%\n", i, (float)count / N * 100);
 51     }
 52 //    fclose(stdin); // for test
 53     return 0;
 54 }
 55
 56 pALGraph initGraph(int N)
 57 {
 58     pALGraph pG;
 59     pG = (pALGraph)malloc(sizeof(ALGraph));
 60     pG->adjList = (pNode *)malloc((N + 1) * sizeof(pNode));
 61     pG->n = N + 1;
 62     pG->visited = (bool *)malloc((N + 1) * sizeof(bool));
 63     memset(pG->visited, false, (N + 1) * sizeof(bool));
 64     for(int i = 0; i < N + 1; i++)
 65     {
 66         pG->adjList[i] = (pNode)malloc(sizeof(Node));
 67         pG->adjList[i]->v = i;
 68         pG->adjList[i]->next = NULL;
 69     }
 70
 71     return pG;
 72 }
 73
 74 void link(pALGraph pG, int v1, int v2)
 75 {
 76     insert(pG->adjList[v1], v2);
 77     insert(pG->adjList[v2], v1);
 78 }
 79
 80 void insert(pNode pN, int vv)
 81 {
 82     pNode tmp = (pNode)malloc(sizeof(Node));
 83     tmp->v = vv;
 84     tmp->next = pN->next;
 85     pN->next = tmp;
 86 //    free(tmp);
 87 }
 88
 89 int BFS(pALGraph pG, int vv, int N)
 90 {
 91     pQueue pQ;
 92     pQ = createQueue(N);
 93
 94     int i, count, level, last, tail;
 95     pG->visited[vv] = true;
 96     count = 1;
 97     level = 0;
 98     last = vv;
 99     inQueue(pQ, vv);
100     while(!isEmpty(pQ))
101     {
102         vv = outQueue(pQ);
103         pNode pN = pG->adjList[vv]->next;
104         while(pN)
105         {
106             if(!pG->visited[pN->v])
107             {
108                 pG->visited[pN->v] = true;
109                 count++;
110                 inQueue(pQ, pN->v);
111                 tail = pN->v;
112             }
113             pN = pN->next;
114         }
115         if(vv == last)
116         {
117             level++;
118             last = tail;
119         }
120         if(level == 6)
121             break;
122     }
123     memset(pG->visited, false, (N + 1) * sizeof(bool));
124
125     return count;
126 }
127
128 pQueue createQueue(int N)
129 {
130     pQueue pQ;
131     pQ = (pQueue)malloc(sizeof(Queue));
132     pQ->elem = (int *)malloc((N + 1) * sizeof(int));
133     pQ->front = pQ->rear = 0;
134     pQ->size = N + 1;
135 }
136
137 bool isEmpty(pQueue pQ)
138 {
139     if(pQ->front != pQ->rear)
140         return false;
141     else
142         return true;
143 }
144
145 void inQueue(pQueue pQ, int e)
146 {
147     pQ->rear = (pQ->rear + 1) % pQ->size;
148     pQ->elem[pQ->rear] = e;
149 }
150
151 int outQueue(pQueue pQ)
152 {
153     pQ->front = (pQ->front + 1) % pQ->size;
154     return pQ->elem[pQ->front];
155 }

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


图6.4 六度空间示意图

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

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

输入格式说明:

输入第1行给出两个正整数,分别表示社交网络图的结点数N (1<N<=104,表示人数)、边数M(<=33*N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。

输出格式说明:

对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。

样例输入与输出:

序号 输入 输出
1
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%
2
10 8
1 2
2 3
3 4
4 5
5 6
6 7
7 8
9 10
1: 70.00%
2: 80.00%
3: 80.00%
4: 80.00%
5: 80.00%
6: 80.00%
7: 80.00%
8: 70.00%
9: 20.00%
10: 20.00%
3
11 10
1 2
1 3
1 4
4 5
6 5
6 7
6 8
8 9
8 10
10 11
1: 100.00%
2: 90.91%
3: 90.91%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 100.00%
9: 100.00%
10: 100.00%
11: 81.82%
4
2 1
1 2
1: 100.00%
2: 100.00%
时间: 2024-10-12 19:57:39

06-图3 六度空间的相关文章

7-7 六度空间(30 分)

"六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人."如图1所示. 图1 六度空间示意图 "六度空间"理论虽然得到广泛的认同,并且正在得到越来越多的应用.但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标.然而由于历史的原因,这样的研究具有太大的局限

机一是看好无人机的市场二是美国即将推出相关

在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packet Delivery Service) 无连接交付抽象地表示大多数分组交换网络都能提供的一种服务.简单地讲,指的是TCP/IP灰暗网按照报文上携带的地址信息把短报文从一台机器传递到另一台机制.因为无连接服务单独传递每个分组,所以不能保证可靠.有序地传递.而且,由于无连接服务通常直接映射到底层的硬件上

ISE和Modelsim联合仿真(转)

ISE和Modelsim联合仿真(转) 地址:http://www.cnblogs.com/feitian629/archive/2013/07/13/3188192.html 相信很多人会遇到过这个问题,不知如何让ISE调用Modelsim进行仿真.我也迷糊了不少时间,查查找找,终于弄明白了,所以有了本文,和大家分享一下.我尽量讲得详细点儿,多多上图. 我的环境:Windows 7 64位,Xilinx ISE Design Suite 13.4(D:\Xilinx\13.4),Modelsi

Log和Canny边缘检测(附Matlab程序)

  一. 实验目的 (1) 通过实验分析不同尺度下LOG和Canny边缘提取算子的性能. (2) 研究这两种边缘提取方法在不同参数下的边缘提取能力. (3) 使用不同的滤波尺度和添加噪声能量(噪声水平),通过与无噪声图像对比,选择最能说明自己结论的滤波尺度和噪声水平,并做出分析说明. 二. 实验原理 边缘的含义:在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色的突变等.尽管图像的边缘点产生的原因

[精彩] 关于DB2的内存分配

这两天在看DB2的内存管理的内容,看的很是模糊,有以下问题不明白,请教 是不是数据库管理器的共享内存就是DB2能够使用的最大内容呢,然后数据库全局内存从管理器内存那里获得分配的内存,然后应用程序全局内存又从数据库全局内存那里获得分配内存的,也就是说他们是一层一层的包含关系.还是我理解有问题,是并列关系的呢? PS 现在DB2好的教材比较少,找了几本书上写的都不是很清楚,谁要要好的资料共享下,先谢了  nic518 回复于:2006-12-31 12:45:01 [导读]本文将向您讲解 DB2 内

3Dx Max制作月光下的城堡CG场景

"Points of View"是一项点评从不同角度和视点能得实物的对比和不同的视觉感受的作品的名字.我设计绘景,以阐明这一论点,混合了一切强大和浪漫的光线,以提供一个对比感强烈的未来“冰冷”城市.接着我开始图像绘景,把我的想法转移到纸上.通常我都是围绕主题以铅笔绘制开始的,研究各个元素的位置,以得到一个动态的组合物.但是在绘景过程中我只在Photoshop中研究了概念,因为我已经有了一张与之相关的由Davide Scridel拍的照片.推荐学习3D MAX基础精讲 在明白了我所想沟通

据进但山式队路变

但是级别却只有级而已不过这已经足以傲视群雄了因为我的等级已经一下子窜到了中国排名的第位只要再努力一把完全可以在等级榜上崭露头角了顿时傲世狂风和傲世狂剑两个大惊失色注已经全部被吸引了过去不客气就不客气谁怕谁啊但是这一切也只是为了杀最后的而清理路障而已那个食人魔首领才是我们真正此行的目的嗯出去吃夜宵吧秦韵亲手做的 对啊我恍然大悟凌月果然心细如尘啊不过幽暗套装虽然等级低了一些却也让我的防御加了不少直接从的防御飞跃至点已然变成了一个准铁板了要是装备一身级以上白银器铠甲的话那估计防御就得在以上绝对可以顶着

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

【测绘图槽】06 永不放弃励志短片

虽然这个视频跟测量没关系,但是激励了老王,我网觉得有必要和大家一起分享这个励志短片,希望大家在最后关头,不管是人生还是工作,都不要放弃!测量空间永远为大家服务! 其实,这个视频我非常大家能够认真地看一次.看完以后,你会知道什么叫做真正的努力,什么叫做真正的执行!我们到底有没有打破自己的极限!难道你仅仅只能每个月赚3000?5000?10000?你真的像视频中的主人公一样,竭尽全力了吗?你们又是否真的明白什么叫做发挥自己的潜能?什么叫做坚持?什么叫拼搏? 想想我们的父母,我们的未来   兄弟姐妹们