1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1050,K=30,oo=1e9; 4 int k,n,ss,tt,cnt[K]; 5 struct Edge{ 6 int from,to,flow,cap; 7 Edge(int _from=0,int _to=0,int _flow=0,int _cap=0):from(_from),to(_to),flow(_flow),cap(_cap){} 8 }; 9 vector<int>res[K]; 10 vector<Edge> edge; 11 int edge_tot; 12 vector<int>point[N]; 13 void add_edge(int f,int t,int c){ 14 edge.push_back(Edge(f,t,0,c)); 15 point[f].push_back(edge_tot++); 16 edge.push_back(Edge(t,f,0,0)); 17 point[t].push_back(edge_tot++); 18 return; 19 } 20 int level[N]; 21 bool bfs(){ 22 memset(level,0,sizeof(level)); 23 queue<int>q; 24 q.push(ss); 25 level[ss]=1; 26 int x; 27 while(!q.empty()){ 28 x=q.front();q.pop(); 29 for(int i=0;i<point[x].size();i++){ 30 Edge& e=edge[point[x][i]]; 31 if(e.cap>e.flow&&!level[e.to]){ 32 level[e.to]=level[x]+1; 33 q.push(e.to); 34 } 35 } 36 } 37 return level[tt]; 38 } 39 int dfs(int k,int aa){ 40 if(k==tt||!aa) return aa; 41 int temp,ans=0; 42 for(int i=0;i<point[k].size();i++){ 43 Edge& e=edge[point[k][i]]; 44 if(e.cap>e.flow&&level[e.to]==level[k]+1&&(temp=dfs(e.to,min(aa,e.cap-e.flow)))){ 45 ans+=temp,aa-=temp; 46 e.flow+=temp,edge[point[k][i]^1].flow-=temp; 47 } 48 if(!aa) return ans; 49 } 50 return ans; 51 } 52 int dinic(){ 53 int ans=0; 54 while(bfs()) ans+=dfs(ss,oo); 55 return ans; 56 } 57 int main(){ 58 int t1,t2; 59 scanf("%d%d",&k,&n); 60 ss=k+n+1,tt=ss+1; 61 for(int i=1;i<=k;i++){ 62 scanf("%d",&cnt[i]); 63 add_edge(n+i,tt,cnt[i]); 64 } 65 for(int i=1;i<=n;i++) add_edge(ss,i,1); 66 for(int i=1;i<=n;i++){ 67 scanf("%d",&t1); 68 for(int j=1;j<=t1;j++){ 69 scanf("%d",&t2); 70 add_edge(i,t2+n,1); 71 } 72 } 73 dinic(); 74 for(int i=1;i<=k;i++){ 75 if(edge[(i-1)<<1].cap>edge[(i-1)<<1].flow){ 76 printf("No Solution!"); 77 return 0; 78 } 79 } 80 for(int i=1;i<=n;i++) 81 for(int j=0;j<point[i].size();j++){ 82 if(edge[point[i][j]].flow==1){ 83 res[edge[point[i][j]].to-n].push_back(i); 84 break; 85 } 86 } 87 for(int i=1;i<=k;i++){ 88 printf("%d:",i); 89 for(int j=0;j<res[i].size();j++) printf("%d ",res[i][j]); 90 printf(" "); 91 } 92 return 0; 93 }