06-图3 六度空间 (30分)

题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/22502

思路:

注意层数判断 即需要last tail 进行判断

06-图3 六度空间 (30分)_第1张图片

codeblock 快捷键

ctrl+shift+c可以快速注释掉多行。

ctrl+shift+x可以取消注释

#include
#include
#include
using namespace std;
#define MAXN 10005

int pic[MAXN][MAXN];    //1为有邻边 0为无边
int flag[MAXN];

int N, M;   //N 是顶点 M 是边

int bfs(int n){
    flag[n] = 1;
    int cnt = 1;    //6层范围内的数
    int level = 0;
    int last = n;   //最后一个结点
    int tail = 0;   //尾巴
    queue<int> q;
    q.push(n);
    int temp;   //  临时结点
    while(!q.empty()){
        temp = q.front();
        q.pop();
        for(int i = 1; i <= N; ++i){
            if(pic[temp][i] && flag[i] == 0){   //有边且未被访问过
                flag[i] = 1;
                q.push(i);
                cnt++;
                tail = i;
            }
        }
        if( temp == last){
            level++;
            last = tail;
        }
        if( level == 6) break;
    }
    return cnt;
}

int main(void){
    scanf("%d%d", &N, &M);
    int x, y;
    for(int i = 1; i <= M; ++i){
        scanf("%d%d", &x, &y);
        pic[x][y] = 1;
        pic[y][x] = 1;
    }
//    for(int i = 1; i <= N; ++i){
//        for(int j = 1; j <= N; ++j)
//            printf("%d ", pic[i][j]);
//        printf("\n");
//    }
    for(int i = 1 ; i <= N ; ++i){
        memset(flag, 0, sizeof(flag));
//        for(int j = 1; j <= N; ++j)
//            printf("%d ", flag[j]);
//        printf("\n");
        int num = bfs(i);
        printf("%d: %.2f%\n", i, num * 100.0 / N);
    }
    return 0;
}

你可能感兴趣的:(【OJ】)