直接贴代码吧咯,这个问题的规模1000*1000的精确覆盖,普通的数据结构过不去了,要用dlx了,除了dlx我没想出来其它的解法,(PS:这是抢来的模板)
/************************************************ Author :xiecong Created Time :2015/9/20 22:55:25 File Name :D:\acm\2015\专题学习\DLX\HUST1017.cpp ************************************************ */ #include <cstdio> #include <iostream> #include <cstring> using namespace std; typedef long long ll; struct DLX{ const static int maxn =100000+7; const static int maxnode = 100000+7; int L[maxn],R[maxn],U[maxn],D[maxn]; int ans[maxn],size,cnt,row[maxn],col[maxn],S[maxn],H[maxn]; /*add data here*/ void del(int c){ L[R[c]]=L[c];R[L[c]]=R[c]; for(int i=D[c];i!=c;i=D[i]) for(int j=R[i];j!=i;j=R[j]) U[D[j]]=U[j],D[U[j]]=D[j],--S[col[j]]; } void add(int c){ R[L[c]]=L[R[c]]=c; for(int i=U[c];i!=c;i=U[i]) for(int j=L[i];j!=i;j=L[j]) ++S[col[U[D[j]]=D[U[j]]=j]]; } void init(int m){ for(int i=0;i<=m;i++){ S[i]=0; L[i]=i-1; R[i]=i+1; U[i]=D[i]=i; } L[0]=m;R[m]=0; size=m+1; memset(H,-1,sizeof(H)); } void link(int x,int y){ ++S[col[size]=y]; row[size]=x; D[size]=D[y]; U[D[y]]=size; U[size]=y; D[y]=size; if(H[x]<0)H[x]=L[size]=R[size]=size; else { R[size]=R[H[x]]; L[R[H[x]]]=size; L[size]=H[x]; R[H[x]]=size; } size++; } bool dfs(int k){ if(!R[0]){ cnt=k; return 1; } int c=R[0];for(int i=R[0];i;i=R[i])if(S[c]>S[i])c=i; del(c); for(int i=D[c];i!=c;i=D[i]){ for(int j=R[i];j!=i;j=R[j])del(col[j]); ans[k]=row[i]; if(dfs(k+1))return true; for(int j=L[i];j!=i;j=L[j])add(col[j]); } add(c); return 0; } void showpath(){ printf("%d",cnt); for(int i=0;i<cnt;i++) printf(" %d",ans[i]); putchar('\n'); } }dlx; int n,m; int main() { while(scanf("%d%d",&n,&m)==2){ dlx.init(m); for(int i=1;i<=n;i++){ int mm, k ; scanf("%d",&mm); for(int j=1;j<=mm;j++){ scanf("%d",&k); dlx.link(i,k); } } if(dlx.dfs(0)) dlx.showpath(); else puts("NO"); } return 0; }