Tarjan 求强连通分量

展开查看

  1. #include
  2. #include
  3. #include
  4. using namespace std;
  5. const int N = 1e4 + 1e3;
  6. int n, m, cnt, dfn[N], low[N], inq[N];
  7. int stk[N], tp, c[N], cnt_c, sz[N];
  8. vector ed[N], ed_c[N];
  9. void tarjan(int u) {

  10. inq[u] = 1;

  11. stk[++tp] = u;

  12. dfn[u] = low[u] = ++cnt;

  13. for (int i = 0, up = ed[u].size(); i < up; ++i) {

  14. if (!dfn[ed[u][i]]) {

  15. tarjan(ed[u][i]);

  16. low[u] = min(low[u], low[ed[u][i]]);

  17. }

  18. else if (inq[ed[u][i]])

  19. low[u] = min(low[u], low[ed[u][i]]);

  20. }

  21. if (dfn[u] == low[u]) {

  22. ++cnt_c;

  23. while (1) {

  24. c[stk[tp]] = cnt_c;

  25. inq[stk[tp]] = 0;

  26. sz[cnt_c]++;

  27. tp--;

  28. if (stk[tp + 1] == u) break;

  29. }

  30. }

  31. }
  32. int main()

  33. {

  34. scanf("%d%d", &n, &m);

  35. for (int i = 1; i <= m; ++i) {

  36. int u, v;

  37. scanf("%d%d", &u, &v);

  38. ed[u].push_back(v);

  39. }

  40. for (int i = 1; i <= n; ++i)

  41. if (!dfn[i]) tarjan(i);

  42. for (int i = 1; i <= n; ++i) {

  43. for (int j = 0, up = ed[i].size(); j < up; ++j) {

  44. if (c[i] != c[ed[i][j]]) {

  45. ed_c[c[i]].push_back(c[ed[i][j]]);

  46. }

  47. }

  48. }

  49. int flag =0, ans = 0;

  50. for (int i = 1; i <= cnt_c; ++i) {

  51. if (!ed_c[i].size()) flag++, ans = sz[i];

  52. }

  53. if (flag > 1) return puts("0"), 0;

  54. printf("%d\n", ans);

  55. }

Tarjan 求点双联通分量

点击展开
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. const int N = 1e5 + 5;
  7. int dfn[N], low[N], cnt, n, m;
  8. int stk[N], tp, root, cut[N], cnt_DCC;
  9. vector<int> ed[N], cut_node, DCC[N];
  10. void tarjan(int u) {
  11.     int flag = 0;
  12.     dfn[u] = low[u] = ++ cnt;
  13.     stk[++tp] = u;
  14.     for (int i = 0, up = ed[u].size(); i < up; ++i) {
  15.         if (!dfn[ed[u][i]]) {
  16.             tarjan(ed[u][i]);
  17.             low[u] = min(low[u], low[ed[u][i]]);
  18.             if (low[ed[u][i]] >= dfn[u]) {
  19.                 ++flag;
  20.                 if (root != u || flag > 1) {
  21.                     cut[u] = 1;
  22.                 }
  23.                 ++cnt_DCC;
  24.                 while (1) {
  25.                     DCC[cnt_DCC].push_back(stk[tp]);
  26.                     tp--;
  27.                     if (stk[tp + 1] == ed[u][i])
  28.                         break;
  29.                 }
  30.                 DCC[cnt_DCC].push_back(u);
  31.             }
  32.         }
  33.         else
  34.             low[u] = min(low[u], dfn[ed[u][i]]);
  35.     }
  36. }
  37. int main()
  38. {
  39.     scanf("%d%d", &n, &m);
  40.     for (int i = 1; i <= m; ++i) {
  41.         int u, v;
  42.         scanf("%d%d", &u, &v);
  43.         ed[u].push_back(v);
  44.         ed[v].push_back(u);
  45.     }
  46.     for (int i = 1; i <= n; ++i) if (!dfn[i])
  47.         tarjan(root = i);
  48.     for (int i = 1; i <= n; ++i)
  49.         if (cut[i]) cut_node.push_back(i);
  50.     printf("%d\n", (int)cut_node.size());
  51.     for (int i = 0, up = cut_node.size(); i < up; ++i)
  52.         printf("%d ", cut_node[i]);
  53.     puts("");
  54.     for (int i = 1; i <= cnt_DCC; ++i) {
  55.         printf("e-DCC %d ", i);
  56.         for (int j = 0, up = DCC[i].size(); j < up; ++j)
  57.             printf("%d ", DCC[i][j]);
  58.         puts("");
  59.     }
  60. }

SPFA

展开
  1. #include <iostream>
  2. #include <cstdio>size=
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <queue>
  6. using namespace std;
  7. typedef long long LL;
  8. const int N = 1e4 + 5, M = 1e6;
  9. int head[N], tot, n, m,  S, vis[N];
  10. LL dis[N];
  11. queue<int> que;
  12. struct edge {
  13.     int nxt, to, w;
  14. }e[M];
  15. void add(int u, int v, int w) {
  16.     e[++tot].nxt = head[u];
  17.     e[tot].to = v;
  18.     e[tot].w = w;
  19.     head[u] = tot;
  20. }
  21. void SPFA() {
  22.     dis[S] = 0;
  23.     que.push(S);
  24.     for (int u; !que.empty(); ) {
  25.         u = que.front(); que.pop();
  26.         vis[u] = 0;
  27.         for (int i = head[u]; i; i = e[i].nxt) {
  28.             int nt = e[i].to;
  29.             if (dis[nt] > dis[u] + e[i].w) {
  30.                 dis[nt] = dis[u] + e[i].w;
  31.                 if (!vis[nt]) que.push(nt), vis[nt] = 1;
  32.             }
  33.         }
  34.     }
  35. }
  36. int main()
  37. {
  38.    scanf("%d%d%d", &n, &m, &S);
  39.    for (int i = 1; i <= m; ++i) {
  40.         int u, v, w;
  41.         scanf("%d%d%d", &u, &v, &w);
  42.         add(u, v, w);
  43.    }
  44.    memset(dis, 120, sizeof(dis));
  45.    SPFA();
  46.    for (int i = 1; i <= n; ++i) {
  47.        if (dis[i] == dis[0])
  48.            printf("%lld ", 2147483647LL);
  49.        else printf("%lld ", dis[i]);
  50.    }
  51. }

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. web 新能优化

    网上的东西太多了都是搜来的东西 留着自己看吧! 摘自 :http://www.cnblogs.com/50614090/archive/2011/08/19/2145620.html 打开网站慢现状分 ...

  2. zookeeper系列(八)zookeeper客户端的底层详解

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步:  一.前言 ...

  3. DB 分库分表的基本思想和切分策略

    DB 分库分表的基本思想和切分策略 一.基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的 ...

  4. C++入门经典-例8.3-子类显示调用父类构造函数

    1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需 ...

  5. IDEA下载安装及绿色方法

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  6. Java - 自动装箱与拆箱详解

    1.装箱与拆箱 装箱,将基本数据类型转为包装类型.拆箱,将包装类型转为基本数据类型. // Byte, Short, Integer, Long, Double, Float, Boolean, Ch ...

  7. 编写可维护的JavaScript代码(部分)

    平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...

  8. 高效C++无锁队列实现-moodycamel::ConcurrentQueue

    国外一牛人做的,支持多平台,支持多线程写.多线程读,并可指定读写token,转载过来. 感觉作者也时刻维护着他这个项目,我提了一些问题,每次都会及时得到答复,而且回复得非常认真仔细,非常赞! 链接地址 ...

  9. 搭建Git服务器及本机克隆提交

    前文 Git是什么? Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首 ...

  10. 方法的可变参数 params

    当你写了一个方法,这个方法需要对传进来的参数进行加工,但是不确定传递的参数的数量的时候 比如,public void int jiafa(int a,int b){a+b;} jiafa(1,2) 但 ...