I - Endless Walk Editorial
by
kyopro_friends
この問題は「頂点数が2以上の強連結成分に到達できる頂点はいくつあるか?」と読み替えることができます。したがって、強連結成分分解をしたあとDPすることで解くことができます。
C++の場合、ACL(Atcoder Library)を使うことで強連結成分分解を容易に行うことができます。
実装例(C++ with ACL)
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
int n,m;
cin >> n >> m;
scc_graph g(n);
vector<vector<int>>G(n);
for(int i=0;i<m;i++){
int u,v;
cin >> u >> v;
u--,v--;
g.add_edge(u,v);
G[u].push_back(v);
}
vector<vector<int>> scc=g.scc();
int k=scc.size();
vector<int> idx(n);
for(int i=0;i<k;i++)for(auto v:scc[i])idx[v]=i;
vector<int>dp(k);
int ans=0;
for(int i=k-1;i>=0;i--){
if(scc[i].size()==1){
for(auto v:G[scc[i][0]])dp[i]|=dp[idx[v]];
}else{
dp[i]=1;
}
if(dp[i])ans+=scc[i].size();
}
cout << ans << endl;
}
posted:
last update: