제출 #404102

#제출 시각아이디문제언어결과실행 시간메모리
404102dooweyFrom Hacks to Snitches (BOI21_watchmen)C++14
0 / 100
112 ms39008 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = 250111;
vector<int> T[N];
int idx[N];
int mod[N];
vector<int> ord[N];
vector<int> dp[N];
vector<bool> vis[N];
bool outit[N];
int qash[N];

struct item{
    ll dist;
    int p;
    int q;
    bool operator<(const item &pq) const {
        return pq.dist < dist;
    }
};

int main(){
    fastIO;
    int n, m;
    cin >> n >> m;
    int u, v;
    for(int i = 1; i <= m ; i ++ ){
        cin >> u >> v;
        T[u].push_back(v);
        T[v].push_back(u);
    }
    int k;
    cin >> k;
    int sz;
    for(int iq = 1; iq <= k; iq ++ ){
        cin >> sz;
        mod[iq] = sz ;
        for(int i = 1; i <= sz ; i ++ ){
            cin >> u;
            qash[u] = i - 1;
            idx[u] = iq;
            ord[iq].push_back(u);
        }
    }
    for(int i = 1; i <= n; i ++ ){
        if(idx[i] == 0){
            dp[i].resize(1,(int)1e9);
            vis[i].resize(1, false);
        }
        else{
            dp[i].resize(mod[idx[i]],(int)1e9);
            vis[i].resize(mod[idx[i]],false);
        }
    }
    dp[1][0] = 0;
    priority_queue<item> pq;
    pq.push({0, 1, 0});
    int node;
    int dis;
    int res;
    int nex;
    int ix;
    int ban0, ban1;
    while(!pq.empty()){
        node = pq.top().p;
        res = pq.top().q;
        dis = pq.top().dist;
        pq.pop();
        if(vis[node][res]) continue;
        vis[node][res]=true;
        if(idx[node] == 0){
            for(auto x : T[node]){
                if(idx[x] == 0){
                    if(dp[x][0] > dis + 1){
                        dp[x][0] = dis + 1;
                        pq.push({dis + 1, x, 0});
                    }
                }
                else{
                    for(int j = 1; j <= mod[idx[x]]; j ++ ){
                        nex = (dis + j) % mod[idx[x]];
                        if(ord[idx[x]][nex] != x){
                            if(dp[x][nex] > dis + j){
                                dp[x][nex] = dis + j;
                                pq.push({dis + j, x, nex});
                            }
                        }
                    }
                }
            }
        }
        else{
            if(!outit[node]){
                outit[node]=true;
                for(auto x : T[node]){
                    if(idx[x] == 0){
                        if(dp[x][0] > dis + 1){
                            dp[x][0] = dis + 1;
                            pq.push({dis + 1, x, 0});
                        }
                    }
                }
            }
            ix = qash[node];
            if(node != ord[idx[node]][(res + 1) % mod[idx[node]]]){
                if(dp[node][(res + 1) % mod[idx[node]]] > dis + 1){
                    dp[node][(res + 1) % mod[idx[node]]] = dis + 1;
                    pq.push({dis + 1, node, (res + 1) % mod[idx[node]]});
                }
            }
            nex = ord[idx[node]][(ix + 1) % mod[idx[node]]];
            if(dp[nex][(res + 1) % mod[idx[node]]] > dis + 1){
                dp[nex][(res + 1) % mod[idx[node]]] = dis + 1;
                pq.push({dis + 1, nex, (res + 1) % mod[idx[node]]});
            }
            ban0 = ord[idx[node]][res];
            ban1 = ord[idx[node]][(res + 1) % mod[idx[node]]];
            nex = ord[idx[node]][(ix - 1 + mod[idx[node]]) % mod[idx[node]]];
            if(nex != ban0 && nex != ban1 && dp[nex][(res + 1) % mod[idx[node]]] > dis + 1){
                dp[nex][(res + 1) % mod[idx[node]]] = dis + 1;
                pq.push({dis + 1, nex, (res + 1) % mod[idx[node]]});
            }
        }
    }
    if(dp[n][0] > (int)1e8)
        cout << "impossible\n";
    else
        cout << dp[n][0] << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...