六度空间

#include <iostream>
#include <cstdio>  
#include <queue>   
using namespace std;
//初始化邻接矩阵
void InitGraph( int n ,int **Graph) {  
    for( int i = 1; i <= n; i++ )  
        for( int j = 1; j <= n; j++ )  
            Graph[i][j] = 0;  
}  
//将对应的关系填入邻接矩阵 
void InsertEdge( int i, int j ,int **Graph) {  
    Graph[i][j] = 1;  
    Graph[j][i] = 1;  
}  
//传入起始点,行数,邻接矩阵,标记数组
double BFS( int curNode, int n ,int **Graph, int* visit) {  
    queue<int> visNode;  //存储被访问过节点的队列
    visit[curNode] = 1;           
    visNode.push( curNode );  
    int count = 1;  
    for( int level = 0; level < 6; level++ ) { //遍历6步
        vector<int> vec;
        while( !visNode.empty() ) {//将被访问过节点,放入向量中,以便访问中间元素  
            int node = visNode.front();  
            vec.push_back( node );  //在vec尾部加入node
            visNode.pop();  //清空访问的节点队列
        }  
        for( int i = 0; i < vec.size(); i++ ) {  
            int node = vec[i];  
            for( int i = 1; i <= n; i++ ) {  //遍历n个节点,将node能够访问到的新节点存入队列中
                if( !visit[i] && Graph[node][i] == 1 ) {  
                    visNode.push( i );  //将该节点能够访问到的节点存入队列中
                    visit[i] = 1; //标记改点已经访问过 
                    count++;//访问一个新的节点时,进行计数  
                }  
            }  
        }
    }
    double rate = (double)count / (double)n; //计算百分比
    return rate * 100.0;  
}  
int main() {    
    int nodenum, routenum;  
    cin>>nodenum>>routenum; 
    int *visit = new int [nodenum+1];//标记数组
    int **Graph = new int* [nodenum+1];//邻接矩阵
    for (int i = 1; i <= nodenum; i++)
    {
        Graph[i] = new int[nodenum+1];
    }
    InitGraph(nodenum, Graph);  
    int a, b;  
    for( int i = 0; i < routenum; i++ ) {  
        cin>>a>>b;
        InsertEdge( a, b ,Graph);  
    }  
    for( int i = 1; i <= nodenum; i++ ) {  
        memset(visit, 0, sizeof(visit[0])*(nodenum+1));  //初始化
        double r = BFS(i, nodenum ,Graph, visit);  //传入起始点,节点总个数,邻接矩阵,标记数组
        printf("%d: %.2lf%%\n", i, r);//输出结果  
    }  
    return 0;  
}
在C语言中实现六度空间可以使用图论中的广度优先搜索算法(BFS)。 首先,需要定义一个结构体来表示每个人,结构体中可以包含一个数组表示与其他人的关系。例如: ```c #define MAX_PEOPLE 1000 typedef struct { int id; int relations[MAX_PEOPLE]; } Person; ``` 其中,id表示每个人的唯一标识,relations数组表示与其他人的关系,如果两个人之间有联系,则在数组中相应位置记录1,否则记录0。 接下来,可以使用一个队列来实现BFS算法,遍历整个社交网络,找到任意两个人之间的最短路径长度。例如: ```c #define MAX_QUEUE_SIZE 10000 int bfs(Person people[], int start, int end) { int visited[MAX_PEOPLE] = {0}; int distance[MAX_PEOPLE] = {0}; int queue[MAX_QUEUE_SIZE]; int front = 0, rear = 0; visited[start] = 1; queue[rear++] = start; while (front != rear) { int current = queue[front++]; if (current == end) { return distance[current]; } for (int i = 0; i < MAX_PEOPLE; i++) { if (people[current].relations[i] == 1 && !visited[i]) { visited[i] = 1; distance[i] = distance[current] + 1; queue[rear++] = i; } } } return -1; // 没有找到路径 } ``` 在上述代码中,visited数组表示每个人是否已经被访问过,distance数组表示每个人到起点的距离,queue数组表示BFS算法中使用的队列。start和end表示起点和终点的标识。算法的返回值是起点到终点的最短路径长度,如果没有找到路径则返回-1。 最后,需要读入数据并构建社交网络,例如: ```c int main() { Person people[MAX_PEOPLE]; int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { people[i].id = i; for (int j = 0; j < n; j++) { people[i].relations[j] = 0; } } for (int i = 0; i < m; i++) { int a, b; scanf("%d %d", &a, &b); people[a].relations[b] = 1; people[b].relations[a] = 1; } int start, end; scanf("%d %d", &start, &end); int distance = bfs(people, start, end); printf("%d\n", distance); return 0; } ``` 在上述代码中,n表示社交网络中的人数,m表示人与人之间的联系数,读入n个人的标识和m个联系,构建相应的关系图。start和end表示起点和终点的标识,计算它们之间的最短路径长度并输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值