1 条题解
-
0
思路
有向传播,最少选择缩点图入度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