CSP前模板复习
Tarjan 求强连通分量
展开查看
#include
#include
#include
using namespace std;
const int N = 1e4 + 1e3;
int n, m, cnt, dfn[N], low[N], inq[N];
int stk[N], tp, c[N], cnt_c, sz[N];
vector ed[N], ed_c[N];
void tarjan(int u) {
inq[u] = 1;
stk[++tp] = u;
dfn[u] = low[u] = ++cnt;
for (int i = 0, up = ed[u].size(); i < up; ++i) {
if (!dfn[ed[u][i]]) {
tarjan(ed[u][i]);
low[u] = min(low[u], low[ed[u][i]]);
}
else if (inq[ed[u][i]])
low[u] = min(low[u], low[ed[u][i]]);
}
if (dfn[u] == low[u]) {
++cnt_c;
while (1) {
c[stk[tp]] = cnt_c;
inq[stk[tp]] = 0;
sz[cnt_c]++;
tp--;
if (stk[tp + 1] == u) break;
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v;
scanf("%d%d", &u, &v);
ed[u].push_back(v);
}
for (int i = 1; i <= n; ++i)
if (!dfn[i]) tarjan(i);
for (int i = 1; i <= n; ++i) {
for (int j = 0, up = ed[i].size(); j < up; ++j) {
if (c[i] != c[ed[i][j]]) {
ed_c[c[i]].push_back(c[ed[i][j]]);
}
}
}
int flag =0, ans = 0;
for (int i = 1; i <= cnt_c; ++i) {
if (!ed_c[i].size()) flag++, ans = sz[i];
}
if (flag > 1) return puts("0"), 0;
printf("%d\n", ans);
}
Tarjan 求点双联通分量
点击展开
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e5 + 5;
int dfn[N], low[N], cnt, n, m;
int stk[N], tp, root, cut[N], cnt_DCC;
vector<int> ed[N], cut_node, DCC[N];
void tarjan(int u) {
int flag = 0;
dfn[u] = low[u] = ++ cnt;
stk[++tp] = u;
for (int i = 0, up = ed[u].size(); i < up; ++i) {
if (!dfn[ed[u][i]]) {
tarjan(ed[u][i]);
low[u] = min(low[u], low[ed[u][i]]);
if (low[ed[u][i]] >= dfn[u]) {
++flag;
if (root != u || flag > 1) {
cut[u] = 1;
}
++cnt_DCC;
while (1) {
DCC[cnt_DCC].push_back(stk[tp]);
tp--;
if (stk[tp + 1] == ed[u][i])
break;
}
DCC[cnt_DCC].push_back(u);
}
}
else
low[u] = min(low[u], dfn[ed[u][i]]);
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v;
scanf("%d%d", &u, &v);
ed[u].push_back(v);
ed[v].push_back(u);
}
for (int i = 1; i <= n; ++i) if (!dfn[i])
tarjan(root = i);
for (int i = 1; i <= n; ++i)
if (cut[i]) cut_node.push_back(i);
printf("%d\n", (int)cut_node.size());
for (int i = 0, up = cut_node.size(); i < up; ++i)
printf("%d ", cut_node[i]);
puts("");
for (int i = 1; i <= cnt_DCC; ++i) {
printf("e-DCC %d ", i);
for (int j = 0, up = DCC[i].size(); j < up; ++j)
printf("%d ", DCC[i][j]);
puts("");
}
}
SPFA
展开
#include <iostream>
#include <cstdio>size=
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef long long LL;
const int N = 1e4 + 5, M = 1e6;
int head[N], tot, n, m, S, vis[N];
LL dis[N];
queue<int> que;
struct edge {
int nxt, to, w;
}e[M];
void add(int u, int v, int w) {
e[++tot].nxt = head[u];
e[tot].to = v;
e[tot].w = w;
head[u] = tot;
}
void SPFA() {
dis[S] = 0;
que.push(S);
for (int u; !que.empty(); ) {
u = que.front(); que.pop();
vis[u] = 0;
for (int i = head[u]; i; i = e[i].nxt) {
int nt = e[i].to;
if (dis[nt] > dis[u] + e[i].w) {
dis[nt] = dis[u] + e[i].w;
if (!vis[nt]) que.push(nt), vis[nt] = 1;
}
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &S);
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
memset(dis, 120, sizeof(dis));
SPFA();
for (int i = 1; i <= n; ++i) {
if (dis[i] == dis[0])
printf("%lld ", 2147483647LL);
else printf("%lld ", dis[i]);
}
}
CSP前模板复习的更多相关文章
- CCF CSP 201509-3 模板生成系统
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-3 模板生成系统 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据 ...
- wawawa8的模板复习计划
wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...
- NOIP前的模板复习和注意事项
联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...
- SDOI2019 省选前模板整理
目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay ...
- 模板复习【updating】
马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...
- [OI]省选前模板整理
省选前把板子整理一遍,如果发现有脑抽写错的情况,欢迎各位神犇打脸 :) 数学知识 数论: //组合数 //C(n,m) 在n个数中选m个的方案数 ll C[N][N]; void get_C(int ...
- noip模板复习
自己敲模板还是有很多容易错的地方 写在注释里面了 LCA #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = ...
- CSP前的板子们
见窝的luogu博客qwq noip前的板子们
- CSP-S 赛前模板复习
快读模板 这个连算法都算不上... inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') ...
随机推荐
- exgcd 解同余方程ax=b(%n)
ax=n(%b) -> ax+by=n 方程有解当且仅当 gcd(a,b) | n ( n是gcd(a,b)的倍数 ) exgcd解得 a*x0+b*y0=gcd(a,b) 记k=n/gc ...
- 基于Redis的分布式锁安全性分析-转
基于Redis的分布式锁到底安全吗(上)? 2017-02-11 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词“Redis 分布式锁”随便到哪个搜索引擎上去搜索一下就知道了 ...
- [译]Webpack 4 — 神秘的SplitChunksc插件
原文链接:Webpack 4 - Mysterious SplitChunks Plugin 官方发布了 webpack 4,舍弃了之前的 commonChunkPlugin,增加了 SplitChu ...
- 阿里云服务器yum源更新问题
阿里云官网也给出了yum卸载重装以及修改源为阿里云内网的文档.步骤这里就不说了,可点击下面的链接进行参考 https://help.aliyun.com/knowledge_detail/670864 ...
- Ngrinder 源码之Maven 项目
Ngrinder支持Maven结构的测试脚本.使用ScriptHandlerFactory来个脚本选择处理器handler,目前有JythonScriptHandler, GroovyScriptHa ...
- [Tool]截屏利器FSCapture7.6下载
下载地址:https://pan.baidu.com/s/1XQ1P5hHwZd0NE7bdz_znQQ 或是:https://files.cnblogs.com/files/xiandedanten ...
- Movidius的深度学习入门
1.Ubuntu虚拟机上安装NC SDK cd /home/shine/Downloads/ mkdir NC_SDK git clone https://github.com/movidius/nc ...
- LC 652. Find Duplicate Subtrees
Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only ne ...
- web搜索框的制作(必应)
搜索框中我们输入一些字或者字母,为何下面就会有一些自动补齐的相关搜索,比如我在搜索输入框中输入一个字母e,下面就会出现饿了么,e租宝,ems等相关的搜索链接.然后经过百度,发现原来很多厂商的服务器早已 ...
- 【例3】设有关系模式R(A, B, C, D, E)与它的函数依赖集F={A→BC, CD→E, B→D, E→A},求R的所有候选键。 解题思路:
通过分析F发现,其所有的属性A.B.C.D.E都是LR类属性,没有L类.R类.N类属性. 因此,先从这些属性中依次取出一个属性,分别求它们的闭包:=ABCDE,=BD,=C,=D, =ABCDE.由于 ...