数据:
/*
99999
3 4
3 1 2 4
2 2 3
2 3 4
*/
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #define mkp make_pair using namespace std; const double EPS=1e-12; typedef long long lon; const lon SZ=1010,S=2010,T=2011,SSZ=2*SZ,one=1,INF=0x7FFFFFFF,mod=1000000007; lon n,m,dfn[SSZ],low[SSZ],cnt,tot,bel[SSZ]; bool mp[SSZ][SSZ],ins[SSZ],mk[SSZ],sz[SSZ]; int src[SSZ][SSZ],dep[SSZ],num; stack<lon> stk; /* 99999 3 4 3 1 2 4 2 2 3 2 3 4 */ bool bfs() { memset(dep,0,sizeof(dep)); queue<int> q; q.push(S); dep[S]=1; for(;q.size();) { int fr=q.front(); q.pop(); //cout<<fr<<endl; for(int i=1;i<=T;++i) { if(src[fr][i]&&!dep[i]) { dep[i]=dep[fr]+1; q.push(i); if(i==T)return 1; } } } return 0; } int dinic(int x,int flow) { if(x==T)return flow; else { int rem=flow; for(int i=1;i<=T&&rem;++i) { if(src[x][i]&&dep[i]==dep[x]+1) { int tmp=dinic(i,min(rem,src[x][i])); if(!tmp)dep[i]=0; rem-=tmp; src[x][i]-=tmp; src[i][x]+=tmp; } } return flow-rem; } } void init() { cin>>n>>m; for(lon i=1;i<=n;++i) { src[S][i]=1; lon knum; cin>>knum; for(lon j=0;j<knum;++j) { lon id; cin>>id; mp[i][id+n]=1; src[i][id+n]=1; } } for(int i=1;i<=m;++i)src[i+n][T]=1; for(;bfs();) { dinic(S,INF); } num=n+m; for(lon i=1;i<=n;++i) { int ok=0; for(int j=1;j<=m;++j) { //cout<<i<<" "<<j<<" "<<src[i][j+n]<<" "<<mp[i][j+n]<<endl; if(src[i][j+n]!=mp[i][j+n]) { mp[j+n][i]=1; ok=1; } } if(!ok) { mk[i]=1;//not used ++num; for(int j=1;j<=n;++j) { mp[j][num]=1; } mp[num][i]=1; } //cout<<mk[i]<<endl; } for(int i=1;i<=m;++i) { //cout<<src[i+n][T]<<endl; if(src[i+n][T]==1) { sz[i]=1; ++num; for(int j=1;j<=m;++j) { mp[num][j+n]=1; } mp[i+n][num]=1; } } } void dfs(lon x) { dfn[x]=low[x]=++cnt; stk.push(x); ins[x]=1; for(lon i=1;i<=num;++i) { if(mp[x][i]) { if(!dfn[i]) { dfs(i); low[x]=min(low[x],low[i]); } else if(ins[i])low[x]=min(low[x],low[i]); } } if(low[x]==dfn[x]) { ++tot; for(;stk.size();) { lon top=stk.top(); stk.pop(); bel[top]=tot; ins[top]=0; if(top==x)break; } } } void work() { for(lon i=1;i<=n+m;++i)if(!dfn[i])dfs(i); for(lon i=1;i<=n;++i) { vector<lon> ans; //cout<<bel[i]<<" "<<bel[i+n]<<endl; for(lon j=1;j<=m;++j) { //cout<<sz[j+n]<<endl; if(mp[i][j+n]&&bel[i]==bel[j+n]) { ans.push_back(j); } } cout<<ans.size(); sort(ans.begin(),ans.end()); for(lon j=0;j<ans.size();++j) { cout<<" "<<ans[j]; } cout<<endl; } for(lon i=1;i<=n;++i) { src[S][i]=0; for(lon j=n+1;j<=n+m;++j)mp[i][j]=mp[j][i]=src[i][j]=0; } for(lon i=1;i<=m;++i) { src[i+n][T]=0; } memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(bel,0,sizeof(bel)); memset(mk,0,sizeof(mk)); memset(sz,0,sizeof(sz)); memset(ins,0,sizeof(ins)); memset(mp,0,sizeof(mp)); memset(src,0,sizeof(src)); for(;stk.size();stk.pop()); cnt=tot=0; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; cin>>casenum; //cout<<casenum<<endl; for(int time=1;time<=casenum;++time) //for(lon time=1;cin>>n;++time) { //printf("Case #%d:\n",time); cout<<"Case #"<<time<<":"<<endl; init(); work(); } return 0; }