1. 程式人生 > >4004.六度空間理論

4004.六度空間理論

六度空間理論

釋出時間: 2018年11月26日 10:17   時間限制: 1000ms   記憶體限制: 128M

核心思想是使用BFS對鄰接表掃描6層計數。

“六度空間”理論又稱作“六度分隔(Six Degrees of Separation)”理論。這個理論可以通俗地闡述為:“你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何一個陌生人。”假如給你一個社交網路圖,請你對每個節點計算符合“六度空間”理論的結點佔結點總數的百分比。

多組資料,每組資料m+1行。第一行有兩個數字n和m,代表有n個人和m組朋友關係。n個人的編號為1到n。第二行到第m+1行每行包括兩個數字a和b,代表這兩個人互相認識。當n和m都等於0時,輸入結束。

每組資料輸出n行,對每個結點輸出與該結點距離不超過6的結點數佔結點總數的百分比,精確到小數點後2位。每個結節點輸出一行,格式為“結點編號:(空格)百分比%”。

10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 8
1 2
2 3
3 4
4 5
5 6
6 7
7 8
9 10
0 0
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%
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%
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 #define maxn 100
 5 
 6 typedef struct node
 7 {
 8     int data;
 9     struct node *next;
10 } Node;
11 
12 Node *V[maxn];//鄰接表
13 int visit[maxn];
14 
15 void BFS(int s, int n)
16 {
17     int count = 1;
18     Node *p;
19 memset(visit, 0, sizeof(visit)); 20 int Queue[maxn]; 21 int front = 0, rear = 0, last = 0; 22 Queue[0] = s; 23 visit[s] = 1; 24 int six = 0; 25 while (front <= last) 26 { 27 p = V[Queue[front++]]->next; 28 while (p)//單層遍歷,一個人的所有朋友遍歷,Queue儲存其友 29 { 30 if (!visit[p->data]) 31 { 32 count++;//計數加一 33 visit[p->data] = 1;//改變訪問狀態 34 Queue[++rear] = p->data;//隊尾賦值 35 } 36 p = p->next; 37 } 38 if (front>last)//判斷此人的一度朋友是否遍歷,如果遍歷結束,進入其二度朋友 39 { 40 last = rear; 41 six++; 42 if (six == 6) 43 break; 44 } 45 } 46 printf("%d: %.2f%%\n", s, count*100.0 / n); 47 } 48 49 int main() 50 { 51 int n, m; 52 int x, y; 53 Node *p; 54 while (1) 55 { 56 cin >> n >> m; 57 if (!n&&!m)break; 58 for (int i = 1; i <= n; i++) 59 { 60 V[i] =new Node; 61 V[i]->data = i; 62 V[i]->next = NULL; 63 }//set up 鄰接表 index 64 while (m--) 65 { 66 cin>>x>>y; 67 p = new Node; 68 p->data = y; 69 p->next = V[x]->next; 70 V[x]->next = p;//y follow V[x] 71 p = new Node; 72 p->data = x; 73 p->next = V[y]->next; 74 V[y]->next = p;//x follow V[y] 75 } 76 for (int i = 1; i <= n; i++) 77 BFS(i, n); 78 } 79 return 0; 80 }