I - Endless Walk 解説 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;
}

投稿日時:
最終更新: