http://poj.org/problem?id=2186

tarjan求强连通分量。

因为SD省选用WinXP+Cena评测而且不开栈,所以dfs只好写手动栈了。

写手动栈时思路清晰一点应该是不会出错的吧。。。

这里tarjan要开两个栈,一个是tarjan用来记录强连通分量的栈,另一个是记录dfs路径的栈。

cur记录当前弧,fa记录dfs树上的father。

对于扫到一个环不需要dfs下去的情况就直接处理,对于需要dfs下去的情况就把下一个点压入栈,记录这下一个点的fa为当前点,同时当前点的cur向下一个位置跳一下。

dfs时经常需要当前点dfs所有它的dfs树上的孩子然后统计它的孩子的信息,如果写手动栈记录哪个后继节点被dfs了需要统计信息和哪个后继节点没有被dfs(这只是图上的情况,树上显然所有后继节点都必须被dfs)不需要统计信息就非常麻烦了。

有一个比较巧的做法是记录上述的fa,如果一个点的当前弧都跳完了,说明这个点的信息都处理好了,然后把这个点的信息传到它的fa上,它的fa就不需要记录哪个后继节点需要统计信息哪个后继节点不需要统计信息了。

#include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 10003;
const int M = 50003; bitset <N> inst;
struct node {int nxt, to;} E[M];
int dfn[N], low[N], tot = 0, fa[N], bel[N], sta[N], statop = 0, st[N], top, cnt = 0, point[N], cur[N], n, m; void ins(int u, int v) {E[++cnt] = (node) {point[u], v}; point[u] = cnt;} void tarjan(int x) {
st[top = 1] = x;
while (top) {
int u = st[top];
if (!dfn[u]) {
inst[u] = 1; sta[++statop] = u;
low[u] = dfn[u] = ++cnt;
}
if (cur[u]) {
int v = E[cur[u]].to;
if (inst[v]) low[u] = min(low[u], dfn[v]);
else if (!dfn[v]) fa[st[++top] = v] = u;
cur[u] = E[cur[u]].nxt;
} else {
low[fa[u]] = min(low[fa[u]], low[u]);
if (low[u] == dfn[u]) {
++tot;
while (sta[statop] != u) {
bel[sta[statop]] = tot;
inst[sta[statop]] = 0;
--statop;
}
inst[u] = 0;
bel[u] = tot; --statop;
}
--top;
}
}
} int du[N]; int main() {
int u, v;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
scanf("%d%d", &u, &v);
ins(u, v);
}
for (int i = 1; i <= n; ++i)
cur[i] = point[i]; cnt = 0;
for (int i = 1; i <= n; ++i)
if (!dfn[i]) tarjan(i); for (int i = 1; i <= n; ++i)
for (int j = point[i]; j; j = E[j].nxt)
if (bel[i] != bel[E[j].to])
++du[bel[i]]; int mark = 0;
for (int i = 1; i <= tot; ++i)
if (du[i] == 0)
if (mark == 0)
mark = i;
else
{puts("0"); return 0;} int ret = 0;
for (int i = 1; i <= n; ++i)
if (bel[i] == mark)
++ret;
printf("%d\n", ret);
return 0;
}

【POJ 2186】Popular Cows的更多相关文章

  1. 【2186】Popular Cows(强连通分支及其缩点)

    id=2186">[2186]Popular Cows(强联通分支及其缩点) Popular Cows Time Limit: 2000MS   Memory Limit: 65536 ...

  2. 【POJ 2182】Lost Cows

    [题目链接] http://poj.org/problem?id=2182 [算法] 树状数组 + 二分 [代码] #include <algorithm> #include <bi ...

  3. POJ 2186:Popular Cows Tarjan模板题

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25945   Accepted: 10612 De ...

  4. 【POJ - 2456】Aggressive cows(二分)

    Aggressive cows 直接上中文了 Descriptions 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x ...

  5. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  6. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  7. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  8. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

  9. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

随机推荐

  1. loj515 「LibreOJ β Round #2」贪心只能过样例

    传送门:https://loj.ac/problem/515 [题解] 容易发现S最大到1000000. 于是我们有一个$O(n^2*S)$的dp做法. 容易发现可以被bitset优化. 于是复杂度就 ...

  2. 【BZOJ】1031 [JSOI2007]字符加密Cipher

    [算法]后缀数组 [题解]把数组复制一遍然后SA处理即可. 后缀数组 #include<cstdio> #include<algorithm> #include<cstr ...

  3. 不可思议的OOM

    本文发现了一类OOM(OutOfMemoryError),这类OOM的特点是崩溃时java堆内存和设备物理内存都充足,下文将带你探索并解释这类OOM抛出的原因. 关键词:  OutOfMemoryEr ...

  4. 边缘检测:Canny算子,Sobel算子,Laplace算子

    1.canny算子 Canny边缘检测算子是John F.Canny于 1986 年开发出来的一个多级边缘检测算法.更为重要的是 Canny 创立了边缘检测计算理论(Computational the ...

  5. css文本垂直水平居中

    一.单行文本居中 .content{ height:100px; line-height:100px; text-align:center; border:1px solid red; } 效果图 二 ...

  6. 2017-2018-1 20179205《Linux内核原理与设计》第十周作业

    <Linux内核原理与设计>第十周作业 教材17.19.20章学习及收获 1.在Linux以及所有unix系统中,设备被分为以下三种:块设备(blkdev)以块为单位寻址,通过块设备节点来 ...

  7. Bookmarks_www2

    Bookmarks Bookmarks alexis- (Alex Incogito) - Repositories · GitHub GitHub - aetcnc-Arduino_DeltaHMI ...

  8. Filecoin:一种去中心化的存储网络(一)

    开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...

  9. [New learn]讲解Objective-c的block知识

    1.简介 OC的Block感觉就是C中饿函数指针,提供回调功能,但是OC中的block比C的函数指针要更加强大,甚至可以访问本地变量和修改本地变量. block在oc中是一个对象,它可以像一般的对象那 ...

  10. SPOJ 375

    默默一看提交时间 -- 这是我以前的代码风格-- #include <cstdio> #include <cstring> #include <vector> #i ...