首页 > 其他分享 >题解:【ABC245F】Endless Walk

题解:【ABC245F】Endless Walk

时间:2022-11-14 14:37:04浏览次数:78  
标签:缩点 连通 一个点 int 题解 Walk ABC245F 分量

题目链接

本题解适合像我这样的不具备思维能力的选手。

首先根据题意,一个点如果符合要求,那它必然在一个点数大于 \(2\) 的强联通分量里,因为如果只有一个点它就哪里都去不了。所以首先先对图进行缩点,顺带记录下每个强连通分量的大小。然后如果一个点它可以走入这个强连通分量里,就也是符合条件的,所以在缩点后的新图上反向建边,遍历一遍看看符合条件的强连通分量可以走到哪些点,最后看哪些被打上标记即可。

\(Code\)

#include<bits/stdc++.h>
#define int long long
using namespace std;

inline int read()
{
    int s=0,w=1; char c=getchar();
    while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
    while(isdigit(c)) s=(s<<3)+(s<<1)+(c^48),c=getchar();
    return s*w;
}

namespace LgxTpre
{
    static const int MAX = 2000010;
    static const int INF = 20070707070707;

    int n,m;
    int x,y;

    struct Graph
    {
        struct edge
        {
            int nex,to;
        }e[MAX<<1];
        int head[MAX],cnt;
        inline void add(int x,int y)
        {
            e[++cnt].nex=head[x];
            head[x]=cnt;
            e[cnt].to=y;
            return;
        }
    }G1,G2;

    int dfn[MAX],low[MAX],tot;
    int stk[MAX],top;
    int sizcol[MAX],col[MAX],num;
    int vis[MAX];
    void tarjan(int now)
    {
        dfn[now]=low[now]=++tot;
        stk[++top]=now;
        vis[now]=1;
        for(int i=G1.head[now];i;i=G1.e[i].nex)
        {
            int to=G1.e[i].to;
            if(!dfn[to]) 
                tarjan(to),
                low[now]=min(low[now],low[to]);
            else    
                if(vis[to])
                    low[now]=min(low[now],dfn[to]);
        }
        if(low[now]==dfn[now])
        {
            vis[now]=0;
            col[now]=++num;
            ++sizcol[num];
            while(stk[top]!=now) col[stk[top]]=num,++sizcol[num],vis[stk[top]]=0,--top;
            --top;
        }
        return;
    }

    int deg[MAX],flag[MAX],ans;
    inline void dfs(int now)
    {
        flag[now]=1;
        for(int i=G2.head[now];i;i=G2.e[i].nex)
        {
            int to=G2.e[i].to;
            if(!flag[to]) dfs(to);
        }
        return;
    }

    inline void lmy_forever()
    {
        n=read(),m=read();
        for(int i=1;i<=m;++i)
            x=read(),y=read(),G1.add(x,y);
        for(int i=1;i<=n;++i)
            if(!dfn[i])
                tarjan(i);
        for(int i=1;i<=n;++i)
            for(int j=G1.head[i],to;j;j=G1.e[j].nex)
                if(col[i]!=col[to=G1.e[j].to])
                    ++deg[i],G2.add(col[to],col[i]);
        for(int i=1;i<=num;++i)
            if(sizcol[i]>=2)
                dfs(i);
        for(int i=1;i<=num;++i)
            if(flag[i])
                ans+=sizcol[i];
        cout<<ans;
    }
};

signed main()
{
    LgxTpre::lmy_forever();
    return (0-0);
}

标签:缩点,连通,一个点,int,题解,Walk,ABC245F,分量
From: https://www.cnblogs.com/LittleTwoawa/p/16888933.html

相关文章

  • Codeforces 722 F Cyclic Cipher 题解 (同余方程,two-pointers)
    题目链接前两天做过一个题意类似但做法不类似的题在这里首先做这道题需要一个结论:(一元)同余方程组有解的充要条件是方程组中的所有方程两两联立有解。证明两个同......
  • CF1650G 『Counting Shortcuts』 题解
    从洛谷博客那里搬过来的(图论专题本来打算先挑最简单的做,结果做了两个多小时(题意就是让你找从起点\(s\)到终点\(t\)的最短路以及次短路个数,本题次短路长度指的是最短......
  • Codeforces 833 题解
    A\(n\)是奇数时恰好可以用完,\(n\)是偶数时多出来的一块没用,所以直接输出\((n+1)/2\)即可。B每个字符出现次数都小于等于字符总数,令\(\Sigma\)是字符集大小,那显然......
  • CF1292E Rin and The Unknown Flower 题解
    IO交互题fflush(stdout)害人不浅!!1注意到如果我们发起询问C和O就可以花费2的代价知道整个串,不过代价过高,所以我们考虑减小点代价。考虑发起询问CO,CH,CC,这样我......
  • TheNameCalculator题解
    TheNameCalculator题解题目链接:TheNameCalculator题解首先看程序开启的保护,有Canary和NX栈不可执行。IDA打开程序,shift+F12查看字符串,发现有"Hereisyourflag:"。点......
  • 833——B题题解
    题目链接题目大意:给一串字符串(只包含0~9),定义一个最优子串的定义:如果该子串同字符种类数大于最最多字符出现数,那么这个子串可以被称为最优子串。解题思路:大眼一看这个数......
  • [ARC086F] Shift and Decrement 题解
    linkSolution一个简易的贪心想法是我们肯定是对于一个相同的序列求出操作到它的最小操作次数,看能否\(\leK\)。注意到我们在第\(x\)次A操作后进行\(-1\)操作相当于......
  • 833(DIV2)——C题题解
    题目链接题目大意:给定n个数,你可以对数值为0的数改变其为任意值,问最后前缀和为0的个数的最大值。思路:这题比较可惜,自己的思路没有问题,但是他少了一些东西。对数组进行前......
  • LG_P4588 [TJOI2018] 数学计算 题解
    LuoguP4588题解这个玩意还是挺好想到的,也不难看出他是一个线段树。没想到可以评上蓝。考虑每次操作对于答案的贡献。由于\(x=1\),所以我们相当于是在维护一堆数的积,初始......
  • DTOJ 3498 无限剑制 题解
    题面题目链接题解想了好久,其实很水tt想写题解主要是因为这题题面是Fate很有意思我们注意到“所有\(v_i\)值域在\([1,5]\)”这个部分分,这种情况下,初始的不同情......