盒子
#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;
}

京公网安备 11010502036488号