每次从第一行选一个数,向下找递增的一条链。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100005;
vector<int> vec[maxn];
int cnt[maxn];
int res[maxn], ans, n, m;
void solve(int pos, int t)
{
if(pos == m || cnt[pos+1] == 0 || vec[pos+1][cnt[pos+1]-1] < vec[pos][t]) return;
res[ans++] = vec[pos+1][cnt[pos+1]-1];
cnt[pos+1]--;
solve(pos+1, cnt[pos+1]);
}
void work()
{
scanf("%d%d", &n, &m);
int ok = 1;
for(int i = 1; i <= n; i++) vec[i].clear();
for(int i = 1; i <= m; i++) {
scanf("%d", &cnt[i]);
for(int j = 0; j < cnt[i]; j++) {
int x;
scanf("%d", &x);
if(j && x < vec[i][j-1]) ok = 0;
vec[i].push_back(x);
}
}
if(!ok) {
printf("No solution\n");
return;
}
ans = 0;
for(int i = vec[1].size()-1; i >= 0; i--) {
res[ans++] = vec[1][i];
solve(1, i);
}
if(ans != n) printf("No solution\n");
else {
for(int i = ans - 1; i >= 0; i--) printf("%d%c", res[i], i ? ' ' : '\n');
}
}
int main()
{
int _;
scanf("%d", &_);
for(int i = 1; i <= _; i++) {
printf("Case #%d: ", i);
work();
}
return 0;
}