@@ -25,15 +25,47 @@ vi coverHK(vector<vi>& g, int n, int m) {
2525}
2626
2727int main () {
28- rep (it,0 ,300000 ) {
29- int N = rand () % 20 , M = rand () % 20 ;
30- int prop = rand ();
28+ const int MAXN = 20 ;
29+ mt19937 rng (17 );
30+ rep (it,0 ,300'000 ) {
31+ int N = rand () % MAXN, M = rand () % MAXN;
3132 vector<vi> gr (N);
32- vi left (N), right (M);
33- rep (i,0 ,N) rep (j,0 ,M) if (rand () < prop) {
34- gr[i].push_back (j);
33+ int co = rand () % 128 < 10 ? 2 : 1 ;
34+ rep (_,0 ,co) {
35+ int prop = rand ();
36+ if (max (N, M) >= 5 && rand () % 128 < 90 ) {
37+ prop /= max (N, M);
38+ prop *= 2 ;
39+ }
40+ rep (i,0 ,N) rep (j,0 ,M) if (rand () < prop) {
41+ gr[i].push_back (j);
42+ }
43+ }
44+ if (rand () % 128 < 20 && N && M) {
45+ int paths = rand () % min (N, M);
46+ vi left (N), right (M);
47+ rep (i,0 ,N) left[i] = i;
48+ rep (i,0 ,M) right[i] = i;
49+ rep (_,0 ,paths) {
50+ shuffle (all (left), rng);
51+ shuffle (all (right), rng);
52+ int len = rand () % min (N, M) + 1 ;
53+ if (rand () & 128 ) gr[left[0 ]].push_back (right[0 ]);
54+ rep (i,1 ,len-1 ) {
55+ gr[left[i]].push_back (right[i-1 ]);
56+ gr[left[i]].push_back (right[i]);
57+ }
58+ if (len > 1 && (rand () & 128 )) gr[left.back ()].push_back (right.back ());
59+ }
60+ }
61+ rep (i,0 ,N) {
62+ // Duplicate edges are okay
63+ // sort(all(gr[i]));
64+ // gr[i].erase(unique(all(gr[i])), gr[i].end());
65+ shuffle (all (gr[i]), rng);
3566 }
3667 auto verify = [&](vi& cover) {
68+ vi left (N), right (M);
3769 for (auto &x: cover) {
3870 if (x < N) left[x] = 1 ;
3971 else right[x - N] = 1 ;
0 commit comments