P4645 [COCI2006-2007#3] BICIKLI(Tarjan+topsort求到某点的方案数)

P4645 COCI2006-2007#3 BICIKLI - 洛谷 | 计算机科学教育新生态

思路:

我们考虑输出inf的情况,可以发现当从1出发到2经过的任意一个点处于一个环内时,路径条数是无穷多的。

有向图上从s到t的经过点,就是从s出发所能经过的所有点与从t出发在反图上所能经过的所有点的交集。

进行拓扑排序时的点的入度,是从s出发所能经过的所有点与从t出发在反图上所能经过的所有点的交集的这张图上的入读,那些不能既被s经过又被t经过的点到这张图上的边所提供的入度是无用的。

Code:

cpp 复制代码
constexpr int N=1e5+5,mod=1e9;

#define fi first
#define se second

int n,m;
int low[N],dfn[N],stk[N],instk[N],tot,top;
int scc[N],sz[N],cnt;
vector<int> e[N],e1[N];
PII p[N];
bool vis1[N],vis2[N];
int d[N],ans[N];

void Tarjan(int u)
{
    dfn[u]=low[u]=++tot;
    stk[++top]=u,instk[u]=1;
    for(auto t:e[u])
    {
        if(!dfn[t])
        {
            Tarjan(t);
            low[u]=min(low[u],low[t]);
        }
        else if(instk[t]) low[u]=min(low[u],dfn[t]);
    }

    if(dfn[u]==low[u])
    {
        int y;
        ++cnt;
        do{
            y=stk[top--];instk[y]=0;
            scc[y]=cnt;
            sz[cnt]++;
        }while(y!=u);
    }
}

void dfs1(int u)
{
    if(vis1[u]) return ;
    vis1[u]=true;
    for(auto t:e[u])
    {
        dfs1(t);
        d[t]++;
    }
}

void dfs2(int u)
{
    if(vis2[u]) return ;
    vis2[u]=true;
    for(auto t:e1[u])
    {
        dfs2(t);
    }
}

void solve()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>p[i].fi>>p[i].se;
        e[p[i].fi].push_back(p[i].se);
        e1[p[i].se].push_back(p[i].fi);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i]) Tarjan(i);
    dfs1(1),dfs2(2);

    for(int i=1;i<=n;i++)
    {
        if(vis1[i]&&vis2[i]&&sz[scc[i]]!=1)
        {
            cout<<"inf";
            return ;
        }
    }

    queue<int> q;
    q.push(1);
    ans[1]=1;
    while(q.size())
    {
        int t=q.front();q.pop();
        for(int v:e[t])
        {
            if(vis2[v])
            {
                ans[v]=(ans[v]+ans[t])%mod;
                d[v]--;
                if(!d[v]) q.push(v);
            }
        }
    }
    cout<<ans[2];
}
相关推荐
wuyk55515 分钟前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
stolentime26 分钟前
CSP-J2026第一轮试题(附答案解析、markdown源码)
c++·csp
船厂电气自动化ai大模型27 分钟前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
Rabitebla28 分钟前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
库玛西37 分钟前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
木井巳38 分钟前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
东方护航数据恢复(深圳)42 分钟前
本地小算力设备数据恢复经典案例实操全解_东方护航数据恢复深圳店
大数据·服务器·算法·ai·gpu算力
Omics Pro1 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
Y幽谷客1 小时前
图像识别入门习题整理
算法
careathers1 小时前
【数据结构】队列
java·数据结构