浙江大学版「データ構造(第2版)」トピックコレクション-例6.1

例6.16次元空間(30ポイント)

「六次の隔たり」理論は「六次の隔たり」理論とも呼ばれます。この理論は、「あなたと見知らぬ人との間に6人以下の人がいる。つまり、最大5人で見知らぬ人を知ることができる」と簡単に言うことができます。図1に示すように。

例:

#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