Cod sursa(job #2940052)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 14 noiembrie 2022 18:48:15
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <bits/stdc++.h>
#define fin cin
#define fout cout

using namespace std;

//ifstream fin("f.in");
//ofstream fout("f.out");

const int TMAX = 500, NMAX = 1e4 + 1, KMAX = 1e5 + 1, QSIZE = (1 << 17) - 1;

bool occ[TMAX][NMAX];
vector<int> gr[NMAX];
vector<int> patr[KMAX];
int len[KMAX];

struct pack {
    int pos, t;
}q[QSIZE];

int l, r;
int qlen;

void push(pack a) {
    q[r] = a;
    qlen++;
    r = (r + 1) & QSIZE;
}
pack pop() {
    qlen--;
    pack a = q[l];
    l = (l + 1) & QSIZE;
    return a;
}

int main()
{
    int n, m, k;
    fin >> n >> m >> k;

    for (int i = 0; i < m; i++) {
        int u, v;
        fin >> u >> v;
        gr[u].push_back(v);
        gr[v].push_back(u);
    }

    for (int i = 0; i < k; i++){
        int pos;
        fin >> len[i];
        for (int j = 0; j < len[i]; j++) {
            fin >> pos;
            patr[i].push_back(pos);
        }
    }

    for (int i = 0; i < TMAX; i++) {
        for (int j = 0; j < k; j++) {
            occ[i][patr[j][i % len[j]]] = 1;
        }
    }

    l = 0, r = 0;
    qlen = 0;
    push({0, 0});
    bool found = 0;
    int ans;
    bool ok = 1;

    while (!found) {
        if (qlen == 0) {
            ok =0;
            break;
        }

        pack cr = pop();

                if (cr.t > 4000 == 0) {
            ok =0;
            break;
        }

        int ct = cr.t % TMAX;
        occ[ct][cr.pos] = 0;

        int nt = (cr.t + 1) % TMAX;
        if (!occ[nt][cr.pos]) {
            occ[nt][cr.pos] = 1;
            push({cr.pos, cr.t + 1});
        }
        for (int nxt: gr[cr.pos]) {

            if (!occ[nt][nxt]) {
                if (nxt == n - 1) {
                    found = 1;
                    ans = cr.t + 1;
                }
                occ[nt][nxt] = 1;
                push({nxt, cr.t + 1});
            }
        }
    }
    if (!ok)
        fout << -1;
    else
    fout << ans;

    return 0;
}