CodeForces-1321D. Sistema de navegación BFS + Pensamiento

CodeForces - 1321D. Sistema de navegación

Dirección del título original:

http://codeforces.com/contest/1321/problem/D

Preguntas básicas:

Le damos un gráfico dirigido, y una secuencia predeterminada a, caminamos a lo largo de esta secuencia predeterminada, en cada ubicación, la navegación volverá a planificar la ruta (la ruta reprogramada debe ser la ruta más corta hasta el punto final) , la ruta puede ser La ruta original también puede ser diferente de la ruta original.Si la diferencia es la reconstrucción, pregunte el número mínimo y máximo posible de reconstrucciones.

Ideas basicas:

Primero construya el borde en reversa, y luego encuentre la ruta más corta desde cada punto hasta el punto final.

Luego, la idea que comencé fue registrar todos los caminos más cortos posibles desde cada punto hasta el punto final y usar set para almacenar en el punto correspondiente, y luego para cada posición de la secuencia dada determinar si su sufijo existe en este En la situación más corta posible desde el punto hasta el punto final, y luego registre los tiempos máximo y mínimo en el juicio, sin embargo, WA4 se ha cerrado automáticamente.

(Aunque siento que no hay un problema lógico en las ideas anteriores, es demasiado complicado incluso si no es WA, por lo que se puede ignorar lo anterior)

La nueva idea también encuentra primero la ruta más corta desde cada punto hasta el punto final, porque el peso del borde es uno, por lo que podemos saber que si la distancia más corta entre los dos puntos y el punto final difiere en uno, dis [u] + 1 == dis [v] entonces v -> extremo más corto debe ser después de u, o ciertamente sin u. Entonces, para cada posición i de una ruta dada, si dis [a [i + 1]] + 1! = Dis [a [i]] entonces la ruta debe ser reconstruida, el número mínimo de reconstrucciones aumenta, de lo contrario está bien, en este momento lo haremos Enumere los puntos conectados a a [i] a si dis [a] + 1 == dis [a [i]], entonces hay otras situaciones de ruta, es decir, la posibilidad de reconstrucción, por lo que aumenta el número máximo de reconstrucciones.

Código de implementación:

#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define INF 0x3f3f3f3f

const int maxn = 2e5 + 10;
int head[maxn];
int cnt = 0;
int n,m;
struct Edge{
    int to,next;
}edge[maxn];
void add_edge(int u,int v) {
    edge[++cnt].next = head[u];
    edge[cnt].to = v;
    head[u] = cnt;
}
int dis[maxn];
void bfs(int s) {
    queue<int> q;
    fill(dis, dis + n + 5, INF);
    q.push(s);
    dis[s] = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int i = head[u]; i != -1; i = edge[i].next) {
            int to = edge[i].to;
            if (dis[to] == INF) {
                dis[to] = dis[u] + 1;
                q.push(edge[i].to);
            }
        }
    }
}
int k,a[maxn];
vector<int> G[maxn];
signed main() {
    IO;
    cin >> n >> m;
    memset(head, -1, sizeof(head));
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        G[u].push_back(v);
        add_edge(v, u);
    }
    cin >> k;
    for (int i = 1; i <= k; i++) cin >> a[i];
    bfs(a[k]);
    int mi = 0, mx = 0;
    for (int i = 1; i < k; i++) {
        if(dis[a[i + 1]] + 1 != dis[a[i]]) mi++;
        for(int j = 0 ; j < G[a[i]].size() ; j ++){
            int to = G[a[i]][j];
            if(to != a[i + 1] && dis[to] + 1 == dis[a[i]]){
                mx++;
                break;
            }
        }
    }
    cout << mi << " " << mx << endl;
    return 0;
}

PD: soy tan malo, no salvé a OAO

Publicado 23 artículos originales · elogiado 7 · visitas 1746

Supongo que te gusta

Origin blog.csdn.net/weixin_44164153/article/details/104610630
Recomendado
Clasificación