程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 06-圖3 六度空間,06-圖六度空間

06-圖3 六度空間,06-圖六度空間

編輯:關於C語言

06-圖3 六度空間,06-圖六度空間


我用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%

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved