Official

F - ドミノ倒し / Domino Effect Editorial by kyopro_friends


各ドミノ(を表す文字列)を頂点とし、「ドミノ \(s\) を倒すとドミノ \(t\) が倒れる」という情報が与えられているとき、頂点 \(s\) から 頂点 \(t\) への有向辺があるようなグラフを考えます。

この問題は、こうして作られたグラフにおいて、頂点 \(X\) から頂点 \(Y\) に移動することが可能であるかを判定すること同値であるため、DFSやBFSなどの探索アルゴリズムを用いることで解くことができます。

実装例(C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin >> n;
	string start, goal;
	cin >> start >> goal;
	
	unordered_map<string, vector<string>> G;
	for(int i=0;i<n;i++){
		string s, t;
		cin >> s >> t;
		G[s].push_back(t);
	}
	
	unordered_set<string> visited;
	auto dfs=[&](auto self, string v){
		if(v==goal)return true;
		if(visited.contains(v))return false;
		visited.insert(v);
		return any_of(G[v].begin(), G[v].end(), [&](string vv){return self(self,vv);});
	};

	if(dfs(dfs,start)){
		cout << "Yes" << endl;
	}else{
		cout << "No" << endl;
	}
}

posted:
last update: