1 条题解

  • 0
    @ 2026-10-25 18:48:32

    思路

    有向传播,最少选择缩点图入度0的强连通分量数;不能只计弱连通块。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    vector<vector<int>>g;vector<int>dfn,low,st,in,comp;int clk=0,cc=0;void dfs(int v){dfn[v]=low[v]=++clk;st.push_back(v);in[v]=1;for(int u:g[v])if(!dfn[u]){dfs(u);low[v]=min(low[v],low[u]);}else if(in[u])low[v]=min(low[v],dfn[u]);if(low[v]==dfn[v]){while(1){int u=st.back();st.pop_back();in[u]=0;comp[u]=cc;if(u==v)break;}cc++;}}int main(){int n;cin>>n;g.resize(n);for(int i=0;i<n;i++){int x;while(cin>>x&&x)g[i].push_back(x-1);}dfn.resize(n);low.resize(n);in.resize(n);comp.resize(n);for(int i=0;i<n;i++)if(!dfn[i])dfs(i);vector<int>incoming(cc);for(int i=0;i<n;i++)for(int j:g[i])if(comp[i]!=comp[j])incoming[comp[j]]=1;cout<<count(incoming.begin(),incoming.end(),0)<<'\n';}
    
    • 1

    信息

    ID
    1407
    时间
    1000ms
    内存
    64MiB
    难度
    普及
    标签
    递交数
    1
    已通过
    1
    上传者