第六周:图(上)连通集 、DFS&BFS

题目集总目录 学习指路博客

06-图1 列出连通集 (25分)

本题链接

非常基础的训练,一定要做

题目大意

输出图中所有连通集。先输出DFS的结果,再输出BFS的结果。

代码

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 11;
int N,E,x,y;
bool visited[maxn];
int edge[maxn][maxn];
queue<int> q;
void DFS(int v) {
    visited[v] = true;
    printf(" %d", v);
    for(int i = 0; i < N; ++i) {
        if(!visited[i] && edge[v][i] == 1) 
            DFS(i);
    }
}
void BFS(int v) {
    q.push(v);
    while(!q.empty()) {
        v = q.front();
        q.pop();
        if(visited[v]) continue;
        visited[v] = true;
        printf(" %d", v);
        for(int i = 0; i < N; ++i) {
            if(!visited[i] && edge[v][i] == 1) 
                q.push(i);
        }
    }
}
int main(){
    scanf("%d %d", &N, &E);
    for(int i = 0; i < E; ++i) {
        scanf("%d %d", &x, &y);
        edge[x][y] = edge[y][x] = 1;
    }
    for(int i = 0; i < N; ++i) visited[i] = false;
    for(int i = 0; i < N; ++i) {
        if(!visited[i]){
            printf("{");
            DFS(i);
            printf(" }\n");
        }
    }
    for(int i = 0; i < N; ++i) visited[i] = false;
    for(int i = 0; i < N; ++i) {
        if(!visited[i]){
            printf("{");
            BFS(i);
            printf(" }\n");
        }
    }
    return 0;
}

测试点

测试点如下

06-图2 Saving James Bond - Easy Version (25分)

本题链接

可怜的007在等着你拯救,你……看着办哈;

代码:

测试点

测试点如下

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

本题链接

在听完课以后,这题的思路应该比较清晰了,不过实现起来还是颇有码量的,有时间就尝试一下。

题目大意

给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。

代码

测试点

测试点如下

最后更新于

这有帮助吗?