修改密码

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

更新中

陈远龙老师主讲 & 答疑

课程题单 - T1005

未购买 · 可先试学24节课

课程目录展开/折叠

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

视频时长:01:05:03
播放快捷键

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

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

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

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

本节课讲解到的源代码

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

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

char data[] = "ABCD";
struct Edge {
    // int w;
    int to;
    int nxt;
};

const int M = 10000;
const int N = 100;
Edge e[M]; // 数组链表 
int head[N]; // head[1] 顶点编号为1的链表头索引(数组索引) 
int cnt;

void addEdge(int u, int v) // , int w
{
    e[++cnt].to = v; // cnt是新分配的节点的索引号 

    // head[u] 头插法
    e[cnt].nxt = head[u];
    head[u] = cnt;
}

// addEdge2
void add_undirected_edge(int u, int v)
{
    addEdge(u, v);
    addEdge(v, u);
}

bool vis[N];
void dfs(int u)
{
    cout << data[u] << ' ';
    vis[u] = true;
    // head[u] 这条链表中 
    for (int i = head[u]; i != 0; i = e[i].nxt)
    {
        // int v = e[i].to;
        if (!vis[e[i].to])
            dfs(e[i].to);
    }
}

bool inq[N];
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] << ' ';
        // head[u1]链表
        for (int i = head[u1]; i != 0; i = e[i].nxt)
        {
            if (!inq[e[i].to])
            {
                q.push(e[i].to);
                inq[e[i].to] = true;
            }
        }

    }
}

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);

    // 打印邻接表
    for (int u = 0; u < 4; u ++)
    {
        cout << u << "->";
        // 遍历head[u]的链表
        for (int i = head[u]; i != 0; i = e[i].nxt)
        {
            cout << e[i].to << ' ';
        }
        cout << endl;
    }

    dfs(0); // A D C B

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

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

char data[] = "ABCD";
const int N = 1000;
// vector<int> g[N]; // 邻接表

/*
struct Edge {
    int to;
    int w;
};

list<Edge> g[N];
*/

list<int> g[N]; // 等价于链式前向星  STL中的链表

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

bool vis[N];
void dfs(int u)
{
    cout << data[u] << ' ';
    vis[u] = true;
    // g[u] list中
    for (auto it = g[u].begin(); it != g[u].end(); it ++)
    {
        if (!vis[*it])
            dfs(*it);    
    } 
}

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);

    // 打印邻接表
    for (int u = 0; u < 4; u ++)
    {
        cout << u << "->";
        // g[u] list链表
        for (auto it = g[u].begin(); it != g[u].end(); it ++)
        {
            cout << *it << ' ';
        }
        cout << endl;
    }

    dfs(0); // A B C D 

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

本节课答疑

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

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

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

目录