• 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%
    
  • 相关阅读:
    边工作边刷题:70天一遍leetcode: day 25-2
    边工作边刷题:70天一遍leetcode: day 25-1
    边工作边刷题:70天一遍leetcode: day 25
    边工作边刷题:70天一遍leetcode: day 26-1
    边工作边刷题:70天一遍leetcode: day 26
    边工作边刷题:70天一遍leetcode: day 27-2
    边工作边刷题:70天一遍leetcode: day 27-1
    边工作边刷题:70天一遍leetcode: day 27
    边工作边刷题:70天一遍leetcode: day 28-2
    c#中sqlhelper类的编写(二)
  • 原文地址:https://www.cnblogs.com/qingkai/p/4442627.html
Copyright © 2020-2023  润新知