课程目录展开/折叠
- 课程直播回放
- 第1课 CSP-JS复赛备考策略&复赛上机环境NOI Linux 2.0安装和使用试学
- 第2课 CSP-J/S复赛备考精讲试学
- 第3课 CSP-J/S复赛备考精讲试学
- 第4课 CSP-J/S复赛备考精讲试学
- 第5课 CSP-J/S复赛备考精讲试学
- 第6课 CSP-J/S复赛备考精讲
- 第7课 CSP-J/S复赛备考精讲
- 第8课 CSP-J/S复赛备考精讲
- 第9课 CSP-J/S复赛备考精讲
- 第10课 CSP-J/S复赛备考精讲
- 第11课 CSP-J/S复赛备考精讲
- 第12课 CSP-J/S复赛备考精讲
- 第13课 CSP-J/S复赛备考精讲
- 第14课 CSP-J/S复赛备考精讲
- 第15课 CSP-J/S复赛备考精讲
- 第16课 CSP-J/S复赛备考精讲
- 第17课 CSP-J/S复赛备考精讲
- 第18课 CSP-J/S复赛备考精讲
第4课 CSP-J/S复赛备考精讲
播放快捷键
播放/暂停:空格(或鼠标单击) 全屏:F(或鼠标双击) 退出全屏:Esc
快进10 / 30 / 60秒:方向键→ / Ctrl + 方向键→ / Shift + 方向键→
快退10 / 30 / 60秒:方向键← / Ctrl + 方向键← / Shift + 方向键←
本节课讲解配套PPT&板书:















本节课讲解到的源代码
源代码下载:第4课 CSP-J/S复赛备考精讲-源代码下载
1. t4 - C1116 - 图的遍历 - 反向建图 - dfs - vector邻接表
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> g[N];
bool vis[N];
int n, m;
int ans[N];
void addEdge(int u, int v)
{
g[u].push_back(v);
}
void dfs(int u, int fa)
{
// cout << u << ' ';
vis[u] = true;
ans[u] = fa; // if (ans[u] == 0) ans[u] = fa
for (int i = 0; i < g[u].size(); i ++)
{
int v = g[u][i];
if (!vis[v]) dfs(v, fa);
}
}
void dfs2()
{
for (int u = n; u >= 1; u --)
{
if (!vis[u]) dfs(u, u);
}
}
int main()
{
// freopen("t4.in", "r", stdin);
// freopen("t4.out", "w", stdout);
const char endl = '\n';
ios::sync_with_stdio(false);
cin.tie(0);
// int n, m;
cin >> n >> m;
for (int i = 0; i < m; i ++)
{
int u, v;
cin >> u >> v;
// addEdge(u, v);
addEdge(v, u); // 反向建图
}
dfs2();
for (int i = 1; i <= n; i ++)
cout << ans[i] << ' ';
return 0;
}
2. t4-2 - C1116 - 图的遍历 - dfs - 链式前向星邻接表
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 1e5 + 5;
struct Edge {
int to;
// int w;
int nxt;
};
Edge e[M];
int cnt = 1;
int head[N];
bool vis[N];
int ans[N];
int n, m;
void addEdge(int u, int v)
{
int cur = cnt ++;
e[cur].to = v;
// head[u] -> cur
e[cur].nxt = head[u];
head[u] = cur;
}
void dfs(int u, int fa)
{
ans[u] = fa;
vis[u] = true;
for (int i = head[u]; i != 0; i = e[i].nxt)
{
int v = e[i].to;
if (!vis[v]) dfs(v, fa);
}
}
void dfs2()
{
for (int u = n; u >= 1; u --)
{
if (!vis[u]) dfs(u, u);
}
}
int main()
{
// freopen("t4.in", "r", stdin);
// freopen("t4.out", "w", stdout);
const char endl = '\n';
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < m; i ++)
{
int u, v;
cin >> u >> v;
// addEdge(u, v);
addEdge(v, u); // 反向建图
}
dfs2();
for (int i = 1; i <= n; i ++)
cout << ans[i] << ' ';
return 0;
}
2. t4-3 - C1116 - 图的遍历 - bfs - 链式前向星邻接表
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 1e5 + 5;
struct Edge {
int to;
// int w;
int nxt;
};
Edge e[M];
int cnt = 1;
int head[N];
bool inq[N];
int ans[N];
int n, m;
void addEdge(int u, int v)
{
int cur = cnt ++;
e[cur].to = v;
// head[u] -> cur
e[cur].nxt = head[u];
head[u] = cur;
}
void bfs(int u)
{
queue<int> q;
q.push(u);
ans[u] = u;
inq[u] = true;
while (!q.empty())
{
int u1 = q.front();
q.pop();
// cout << u1 << ' ';
for (int i = head[u1]; i != 0; i = e[i].nxt)
{
int v = e[i].to;
if (!inq[v])
{
q.push(v);
ans[v] = u;
inq[v] = true;
}
}
}
}
void bfs2()
{
for (int u = n; u >= 1; u --)
{
if (!inq[u]) bfs(u);
}
}
int main()
{
// freopen("t4.in", "r", stdin);
// freopen("t4.out", "w", stdout);
const char endl = '\n';
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < m; i ++)
{
int u, v;
cin >> u >> v;
// addEdge(u, v);
addEdge(v, u); // 反向建图
}
bfs2();
for (int i = 1; i <= n; i ++)
cout << ans[i] << ' ';
return 0;
}
本节课课后练习题
本节课答疑
建议大家有问题先通过AI答疑(比如:DeepSeek 等),AI时代需要学会使用AI辅助学习
陈远龙老师视频讲解:如何使用DeepSeek进行答疑?
通过AI未能获得满意解答的,可以联系陈远龙老师答疑
目录