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前模板复习的更多相关文章

  1. CCF CSP 201509-3 模板生成系统

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-3 模板生成系统 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据 ...

  2. wawawa8的模板复习计划

    wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...

  3. NOIP前的模板复习和注意事项

    联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...

  4. SDOI2019 省选前模板整理

    目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay ...

  5. 模板复习【updating】

    马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...

  6. [OI]省选前模板整理

    省选前把板子整理一遍,如果发现有脑抽写错的情况,欢迎各位神犇打脸 :) 数学知识 数论: //组合数 //C(n,m) 在n个数中选m个的方案数 ll C[N][N]; void get_C(int ...

  7. noip模板复习

    自己敲模板还是有很多容易错的地方 写在注释里面了 LCA #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = ...

  8. CSP前的板子们

    见窝的luogu博客qwq noip前的板子们

  9. CSP-S 赛前模板复习

    快读模板 这个连算法都算不上... inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') ...

随机推荐

  1. ubuntu 下vscode 修改主题 注释斜体

    找到vscode的程序目录 全局搜索extensions 找到目录 /home/your_usr_name/.vscode/extensions 这里修改 注释字体 直接删掉fontStyle for ...

  2. 测试linux服务器是否能接入微信

    官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 php.代码 <?php $a = $_GE ...

  3. 黑马vue---1-7、vue杂记

    黑马vue---1-7.vue杂记 一.总结 一句话总结: · 我最大的优势在于潜力,也就是孤独学习的能力.旁观者(l)看的比我清楚. · 那些游戏主播,比如英雄联盟主播,年复一年的玩一个游戏,一个英 ...

  4. 配置Log4j 详解

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  5. 手动部署 Ceph Mimic 三节点

    目录 文章目录 目录 前文列表 部署拓扑 存储设备拓扑 网络拓扑 基础系统环境 安装 ceph-deploy 半自动化部署工具 部署 MON 部署 Manager 部署 OSD 部署 MDS 部署 R ...

  6. HashMap 的实现原理解析(转载)

    HashMap 概述 HashMap 是基于哈希表的 Map 接口的非同步实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.此类不保证映射的顺序,特别是它不保证该顺序恒久不 ...

  7. MySQL 将 字符串 转为 整数

    MySQL 将 字符串 转为 整数 1.CAST(epr AS type) 1)type 为 SIGNED " AS SIGNED); 效果如下: 2)type 为 UNSIGNED &qu ...

  8. Django>ORM字段和参数

    Django之ORM字段和参数   字段 常用字段 AutoField 自增int自增列,必须填入参数 primary_key=True. 当model中如果没有自增列,则自动会创建一个列名为id的列 ...

  9. 页面Demo实现

    1.实现效果如下所示: 此Demo涉及到的知识点有: 1.页面布局思路; 2.TableViewCell实现单元格动态行高; 3.设置字符串中数字的颜色; 4.Cell圆角实现方法之一; 5.Cell ...

  10. for循环使用

    cat > a.sh <<EOF #!/bin/bash export NODE_NAMES=(kube-test1 kube-test2 kube-test3 kube-test4 ...