You are given a bipartite graph G = (U, V, E), U is the set of vertices of the first part, V is the set of vertices of the second part and E is the set of edges. There might be multiple edges.
Let's call some subset of its edges k-covering iff the graph has each of its vertices incident to at least k edges. Minimal k-covering is such a k-covering that the size of the subset is minimal possible.
Your task is to find minimal k-covering for each , where minDegree is the minimal degree of any vertex in graph G.
The first line contains three integers n1, n2 and m (1 ≤ n1, n2 ≤ 2000, 0 ≤ m ≤ 2000) — the number of vertices in the first part, the number of vertices in the second part and the number of edges, respectively.
The i-th of the next m lines contain two integers ui and vi (1 ≤ ui ≤ n1, 1 ≤ vi ≤ n2) — the description of the i-th edge, ui is the index of the vertex in the first part and vi is the index of the vertex in the second part.
For each print the subset of edges (minimal k-covering) in separate line.
The first integer cntk of the k-th line is the number of edges in minimal k-covering of the graph. Then cntk integers follow — original indices of the edges which belong to the minimal k-covering, these indices should be pairwise distinct. Edges are numbered 1 through m in order they are given in the input.
3 3 7 1 2 2 3 1 3 3 2 3 3 2 1 2 1
0 3 3 7 4 6 1 3 6 7 4 5
1 1 5 1 1 1 1 1 1 1 1 1 1
0 1 5 2 4 5 3 3 4 5 4 2 3 4 5 5 1 2 3 4 5
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; #define rep(i,a,b) for(int i=a;i<=b;i++) #define per(i,a,b) for(int i=b-1;i>=a;i--) #define all(a) (a).begin(),(a).end() #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define eb emplace_back #define f first #define s second ll rd(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int INF=0x3f3f3f3f; class edge{ public: int s,e,f; edge(){} edge(int s,int e,int f):s(s),e(e),f(f){} }; vector<edge> Ve; vi conn[10050]; void epush(int s,int e,int f){ conn[s].pb(Ve.size()); conn[e].pb(Ve.size()+1); Ve.eb(s,e,f); Ve.eb(e,s,0); } int in[2050][2]; int dis[10050]; int dchk[10050]; int pos[10050]; int DFS(int n,int snk,int C){ if(n==snk)return 1; dchk[n]=C; for(;pos[n]<conn[n].size();pos[n]++){ int it=conn[n][pos[n]]; edge &ed=Ve[it]; if(ed.f==0||dchk[ed.e]==C||dis[ed.e]!=dis[ed.s]+1)continue; if(DFS(ed.e,snk,C)){ Ve[it].f--; Ve[it^1].f++; return 1; } } return 0; } int getFlow(int src,int snk){ int i,j; vi Vu; rep(i,0,snk) dis[i]=INF,dchk[i]=0,pos[i]=0; dis[src]=0; Vu.pb(src); for(i=0;i<Vu.size();i++){ for(auto it:conn[Vu[i]]){ edge &ed=Ve[it]; if(ed.f==0||dis[Ve[it].e]!=INF)continue; dis[Ve[it].e]=dis[Ve[it].s]+1; Vu.pb(Ve[it].e); } } if(dis[snk]==INF)return 0; int f=0; while(DFS(src,snk,f+1))f++; return f; } int deg[4050]; bool echk[2050]; vi Vl[4050]; int main(){ #ifdef happy freopen("in.txt","r",stdin); #endif int N1=rd(),N2=rd(),M=rd(),i,j,k; rep(i,1,M){ int t1=rd(),t2=rd(); deg[t1]++,deg[N1+t2]++; epush(t1,t2+N1,1); in[i][0]=t1;in[i][1]=t2; } int src=0,snk=N1+N2+1; rep(i,1,N1)epush(src,i,0); rep(i,1,N2)epush(i+N1,snk,0); int mn=INF; rep(i,1,N1+N2) mn=min(mn,deg[i]); puts("0"); rep(q,1,mn){ for(auto &it:Ve){ if(it.s==src)it.f++; if(it.e==snk)it.f++; } int f=0,t; while(t=getFlow(src,snk))f+=t; rep(i,1,M)echk[i]=false; vi Va; rep(i,0,M-1)if(Ve[2*i].f==0)Va.pb(i+1),echk[i+1]=true; rep(i,1,N1+N2)Vl[i].clear(); rep(i,1,M){ if(echk[i])continue; Vl[in[i][0]].pb(i); Vl[in[i][1]+N1].pb(i); } for(auto &it:Ve){ if(it.s!=src&&it.e!=snk)continue; int t=it.f; int n=it.e; if(it.e==snk)n=it.s; for(int i=0;i<it.f;i++)Va.pb(Vl[n][i]); } printf("%d ",Va.size()); for(auto it:Va)printf("%d ",it); printf("\n"); } }