浙大版《数据结构(第2版)》题目集-实例6.1

实例6.1 六度空间 (30point(s))

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

Example:

#include <iostream>
#include <iomanip>
#include <vector>
#include <deque>

using namespace std;

#define MaxVertexNum  1008
typedef int WeightType;
typedef int Vertex;
typedef struct GNode *PtrToGNode;
struct GNode {
    int Nv;
    int Ne;
    WeightType G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode Graph;

Graph ReadG()
{
    Graph G = new GNode;
    cin >> G->Nv >> G->Ne;
    for(int i = 0; i < G->Ne; i++) {
        int s, d;
        cin >> s >> d;
        G->G[s][d] = 1;
        G->G[d][s] = 1;
    }
    return G;
}

deque<Vertex> queue(MaxVertexNum);

double SixDegree(Graph G, Vertex i)
{
    vector<bool> Visited(G->Nv);
    vector<int>  Dist(G->Nv);
    Visited[i] = true;
    Dist[i] = 0;
    queue.push_back(i);
    while(!queue.empty()) {
        i = queue.front();
        queue.pop_front();
        for(Vertex k = 1; k <= G->Nv; k++) {
            if(G->G[i][k] && !Visited[k]) {
                Visited[k] = true;
                Dist[k] = Dist[i]+1;
                if(Dist[k] < 6) queue.push_back(k);
            }
        }
    }
    int cnt = 0;
    for(Vertex k = 1; k <= G->Nv; k++) {
        if(Visited[k]) cnt++;
    }
    return (double)cnt/G->Nv * 100;
}

int main()
{
    Graph G = ReadG();
    for(Vertex i = 1; i <= G->Nv; i++) {
        cout << i << ": " << scientific << fixed << setprecision(2) << SixDegree(G, i) << '%' << endl;
    }
    return 0;
}

思路:

无向图的 BFS,利用 Dist 记录距离,当距离等于 6 时不用入队,最后 Visited 里的个数,就是符合要求的顶点。

猜你喜欢

转载自blog.csdn.net/u012571715/article/details/113355045