#include<bits/stdc++.h>
using namespace std;
int n,m,tot,cnt,t[400002],v[800003],nx[800003],hd[400003];
int g[200002][2];
int b[400002];
inline void add(int x,int y){
v[++tot]=y,nx[tot]=hd[x],hd[x]=tot;
}
void dfs(int x,int h){
b[x]=h;
for(int i=hd[x];i;i=nx[i]){
if(b[v[i]]==h){puts("No");exit(0);}
if(!b[v[i]])dfs(v[i],h);
}
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=0,k;i<m;++i){
scanf("%d",&k);
for(int j=0,c;j<k;++j){
scanf("%d",&c);
cnt++;
t[cnt]=j?cnt-1:0;
if(g[c][0])g[c][1]=cnt;
else g[c][0]=cnt;
}
}
for(int i=1;i<=cnt;++i)
if(t[i])add(i,t[i]);
for(int i=1;i<=n;++i){
if(t[g[i][0]])add(g[i][1],t[g[i][0]]);
if(t[g[i][1]])add(g[i][0],t[g[i][1]]);
}
for(int i=1;i<=cnt;++i)if(!b[i])dfs(i,i);
puts("Yes");
return 0;
}
其中如果a和b之间有边,就说明要删除a就得先删除b。
然后再判断有没有出现环