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%%
", 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%
原文地址:https://www.cnblogs.com/qingkai/p/4442627.html