盒子
#include<iostream> #include <bits/stdc++.h> using namespace std; #define ll long long #define endl "\n" struct p { ll x,y,z; }; const int N=1e6+10,inf=0x3f3f3f3f; ll n, m,k; ll a[N]; ll d[N]; int find(ll x) { if (d[x] != x)return d[x] = find(d[x]); return d[x]; } void merge(int x, int y) { x = find(x); y = find(y); if (x != y)d[x] = d[y]; } vector<int>e[N]; void slove() { cin>>n>>k; for(int i=1;i<=k+n;i++)d[i]=i;//初始化 for(int i=1;i<=n;i++) { cin>>m; for(int j=1;j<=m;j++) { int x; cin>>x; e[k+i].push_back(x); merge(x,k+i);//并查集合并 } } for(int i=1;i<=k;i++) cin>>a[i]; int g=0; for(int i=1;i<=k;i++) { int f=find(a[i]); if(e[f][e[f].size()-1]==a[i]) { e[f].pop_back();//从顶部删除 } else { g=1; break; } } if(g)cout<<"NO"; else cout<<"YES"; } int main() { int t; t = 1; //cin>>t; while (t--) { slove(); } return 0; }