题意:给你一堆牌,和一些洗牌机,可以改变牌的顺序,问你能不能通过洗牌机把数字为x的牌洗到第一个位置。
题解:反向建边,dfs判断连通性
#include<cstdio> #include<vector> using namespace std; const int maxn = 200000+4; int a[maxn]; vector<int> 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; }
时间: 2024-10-13 06:28:46