题意:给你一堆牌,和一些洗牌机,可以改变牌的顺序,问你能不能通过洗牌机把数字为x的牌洗到第一个位置。
题解:反向建边,dfs判断连通性
#include#include using namespace std;const int maxn = 200000+4;int a[maxn];vector son[maxn];int x;bool vis[maxn];bool dfs(int u){ if(a[u] == x) return true; for(int i = 0; i < son[u].size(); i++){ int v = son[u][i]; if(!vis[v]){ vis[v] = 1; if(dfs(v)) return true; } } return false;}int main(){ //freopen("in.txt","r",stdin); int n; scanf("%d",&n); for(int i = 0; i < n; i++){ scanf("%d",a+i); } int k; scanf("%d",&k); for(int i = 0; i < k; i++){ for(int j = 0; j < n; j++){ int t; scanf("%d",&t); if(t-1!=j) son[j].push_back(t-1); } } scanf("%d",&x); printf("%s",dfs(0)?"YES":"NO"); return 0;}