• POJ 2186 挑战 --牛红人 强连通分量——Tarjan


    题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c 。另外每个奶牛都是欢迎他自己的。求出被所有的奶牛欢迎的奶牛的数目.#include <iostream>#include <cstdio>

    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long Ull;
    #define MM(a,b) memset(a,b,sizeof(a));
    const double eps = 1e-10;
    const int  inf =0x7f7f7f7f;
    const double pi=acos(-1);
    const int maxn=10000;
    
    vector<int> G[maxn+10];
    int n,m,deg[maxn+10],pre[maxn+10],dfs_clock,scc_cnt,sccno[maxn+10],lowlink[maxn+10];
    stack<int> S;
    
    void tarjan(int u)
    {
        pre[u]=lowlink[u]=++dfs_clock;
        S.push(u);
        for(int i=0;i<G[u].size();i++)
        {
            int v=G[u][i];
            if(!pre[v])
                {
                    tarjan(v);
                    lowlink[u]=min(lowlink[u],lowlink[v]);
                }
            else if(!sccno[v])
                    lowlink[u]=min(lowlink[u],pre[v]);
        }
    
        if(lowlink[u]==pre[u])
        {
            scc_cnt++;
            while(1)
            {
                int x=S.top();S.pop();
                sccno[x]=scc_cnt;
                if(x==u) break;//找到了当前强连通的起始节点就退出,
    //不然会破坏其他强连通分量 } } } void find_scc() { MM(pre,0);MM(sccno,0); scc_cnt=dfs_clock=0; for(int i=1;i<=n;i++) if(!pre[i]) tarjan(i); } int main() { while(~scanf("%d %d",&n,&m)) { for(int i=1;i<=n;i++) G[i].clear(); for(int i=1;i<=m;i++) { int u,v; scanf("%d %d",&u,&v); G[u].push_back(v); } find_scc(); MM(deg,0); for(int u=1;u<=n;u++) for(int j=0;j<G[u].size();j++) { int v=G[u][j]; if(sccno[u]!=sccno[v]) deg[sccno[u]]=1; } int cnt=0,ans=0; for(int i=1;i<=scc_cnt;i++) if(!deg[i]) cnt++; if(cnt==1) { for(int i=1;i<=n;i++) if(!deg[sccno[i]]) ans++; } printf("%d ",ans); } return 0; }

      分析:强连通分量裸题,缩点成DAG后,只要求出出度为0的强连通就好,若不止1个,则说明不存在

    被所有牛都视为红人的强连通存在;否则直接输出出度为0的强连通的牛的个数

  • 相关阅读:
    计算几何中的精度问题
    codeforces上分计划
    洛谷P1962 斐波那契数列 (矩阵快速幂)
    codeforces 1474 E
    codeforces 1474 C
    codeforces 1467 E
    牛客练习赛76 F phi and phi (莫比乌斯反演)
    牛客练习赛76 D 魔物消灭计划 (斯坦纳树)
    牛客练习赛76 E 牛牛数数 (线性基)
    codeforces 1467 D. Sum of Paths (dp)
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5474662.html
Copyright © 2020-2023  润新知