修改密码

全面备考2025 CSP-J 初赛 & 复赛直播课

更新中

陈远龙老师主讲 & 答疑

课程题单 - T1005

未购买 · 可先试学24节课

课程目录展开/折叠

第2课 CSP-J大纲知识专题&初赛真题精讲

视频时长:57:50
播放快捷键

播放/暂停:空格(或鼠标单击)      全屏:F(或鼠标双击)      退出全屏:Esc

快进10 / 30 / 60秒:方向键→ / Ctrl + 方向键→ / Shift + 方向键→

快退10 / 30 / 60秒:方向键← / Ctrl + 方向键← / Shift + 方向键←

本节课讲解配套PPT&板书:

本节课讲解到的源代码

源代码下载:第2课 CSP-J大纲知识专题&初赛真题精讲-源代码下载

1. 图-邻接表-1
#include <bits/stdc++.h>
using namespace std;

char data[] = {'A', 'B', 'C', 'D'};

vector<int> g[4]; // 邻接表实现 

bool vis[4];
void dfs(int u)
{
    cout << data[u] << ' ';
    vis[u] = true;

    // dfs u的邻接点
    // g[u] vector中
    for (int j = 0; j < g[u].size(); j ++)
    {
        int v = g[u][j];
        if (!vis[v])
            dfs(v);
        /* 
        if (!vis[g[u][j]])
            dfs(g[u][j]);
        */
    } 

}

bool inq[4];
void bfs(int u)
{
    queue<int> q;
    q.push(u);
    inq[u] = true;

    while (!q.empty())
    {
        int u1 = q.front();
        q.pop();
        cout << data[u1] << ' ';
        // g[u1]
        for (int j = 0; j < g[u1].size(); j ++)
        {
            // int v = g[u1][j];
            if (!inq[g[u1][j]])
            {
                q.push(g[u1][j]);
                inq[g[u1][j]] = true;
            }
        }
    }
}

void addEdge(int u, int v)
{
    g[u].push_back(v);
    g[v].push_back(u);
}

int main()
{

    // 构建图 
    g[0].push_back(1);
    g[0].push_back(3);

    g[1].push_back(0);
    g[1].push_back(2);
    g[1].push_back(3);

    g[2].push_back(1);
    g[2].push_back(3);

    g[3].push_back(0);
    g[3].push_back(1);
    g[3].push_back(2);

    // 打印邻接表 
    for (int i = 0; i < 4; i ++)
    {
        // g[i]
        cout << i << "->";
        for (int j = 0; j < g[i].size(); j ++)
            cout << g[i][j] << ' ';
        cout << endl;
    }

    cout << endl;
    dfs(0); // A B C D
    cout << endl;

    bfs(0);  // A B D C

    return 0;
} 
2. 图-邻接表-2
#include <bits/stdc++.h>
using namespace std;

char data[] = {'A', 'B', 'C', 'D'};

// 链表节点 
// 边节点 EdgeNode Node 
// 以边为核心 
struct Edge {
    int to; // 边的终点 指向的节点编号,邻接点编号u -> v 代表的是v 
    // int w;
    int nxt; // 指向下一个Edge节点 
};

const int M = 1000;
Edge e[M];
int cnt = 1; // 分配链表节点空间 
int head[N]; // 节点的链表头数组, head[1] 代表节点编号1的链表头索引(指针) 

// 构建u的(邻接表)链表 - 头插法 
// 只增加一条边 
void addEdge(int u, int v)
{
    int cur = cnt++; // 给v节点分配空间
    e[cur].to = v;

    // 链接到u的链表中,头插法
    e[cur].nxt = head[u];
    head[u] = cur;
}

void dfs(int u)
{

}

void bfs(int u)
{

}

int main()
{
    addEdge(0, 1);
    addEdge(0, 3);

    addEdge(1, 0);
    addEdge(1, 2);
    addEdge(1, 3);

    addEdge(2, 1);
    addEdge(2, 3);

    addEdge(3, 0);
    addEdge(3, 1);
    addEdge(3, 2);

    // 打印邻接表(链表) 

    return 0;
} 
本节课无课后练习

本节课答疑

建议大家有问题先通过AI答疑(比如:DeepSeek 等),AI时代需要学会使用AI辅助学习

陈远龙老师视频讲解:如何使用DeepSeek进行答疑?

通过AI未能获得满意解答的,可以联系陈远龙老师答疑

目录