集训总结1
集训总结1
1 .涉及知识点
1.1 二分图(最大匹配,最大独立集,最小点覆盖,最小边覆盖)
1.1.1 涉及算法:
匈牙利算法,dinic。
相关参见 【学习笔记】二分图。
1.2 连通性
1.2.1 涉及算法:
- Kosaraju 算法
- Tarjan 算法(真是哪都有他)
1.2.2 解决问题
使用 Kosaraju 算法 可求解 强连通分量,缩点。
使用 Tarjan 算法 可求解 强连通分量,割点,桥,点双连通分量,边双连通分量,缩点......
1.2.3 时间复杂度
定义图 $G$ 中共有 $n$ 个点, $m$ 条边。
Kosaraju 算法在图 $G$ 中求解 强连通分量 的复杂度为 $O(n+m)$
Tarjan 算法在在图 $G$ 中求解 强连通分量 的复杂度为 $O(n)$
1.2.4 代码实现
Kosaraju 算法
void dfs1(int u){
if(vis[u]) return;
vis[u] = 1;
for(int i=0; i<G[u].size(); i++)
dfs1(G[u][i]);
S.push_back(u);
}
void dfs2(int u){
if(sccno[u]) return;
sccno[u] = cnt;
for(int i=0; i<rG[u].size(); i++)
dfs2(rG[u][i]);
}
void Kosaraju(int n) {
cnt = 0;
S.clear();
memset(vis,0,sizeof(vis));
memset(sccno,0,sizeof(sccno));
for(int i=1; i<=n; i++)
dfs1(i);
for(int i=n-1; i>=0; i--){
if(!sccno[S[i]]){
cnt++;
dfs2(S[i]);
}
}
}
Tarjan 算法(写得丑死了呜呜)
inline void tarjan(int u) {
low[u] = dfn[u] = ++cnt;
s[++tp] = u, isin[u] = 1;
int son=0;
for(int i = g1.head[u]; i ; i = g1.next[i]) {
son++;
int v = g1.to[i];
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
if(dfn[u] < low[v])b1.add(u, v);
if((u != root && dfn[u] <= low[v])||(u==root&&son>1)) {
if(dfn[b] >= dfn[v])p[u] = 1;
}
} else if(isin[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]) {
++ans;
while(1) {
long long v = s[tp--];
isin[v] = 0;
scc[v] = ans;
sum[ans]++;
if(u == v) break;
}
}
}
2 所遇到的问题及解决方法
Q:在洛谷上过了的题在 NKOJ 上过不了怎么办?
A:骚扰zz***让他帮我调代码就过了。
Q:一道题调了半天发现输入没有输入对怎么办?
A:凉拌增加更多调试以获取更好的体验!
Q:提交题目的时候忘删调试甚至于把 OJ 卡炸了怎么办?
A:拒绝 std::cerr
从我做起。
这是这篇博客的第 $114$ 行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现