Sto cercando di risolvere patrol2 con una BFS leggermente modificata.
Passano tutti i testcase apparte al 004 e dal 016 al 021.
L’approccio è una BFS che ogni volta che nei neighbours trova un vertex con una guardia fa distanza++.
Ovviamente ho dovuto togliere il visited per l’uscita, in modo da ricalcolare il percorso da tutti i vicini e trovare quello minimo.
Penso di essermi dimenticato qualche edgecase particolare, ma non mi viene in mente cosa potrebbe essere.
#include <fstream>
#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
class Graph
{
public:
int N = 0;
vector<vector<int>> adj;
Graph(int n)
{
adj.resize(n);
N = n;
}
void addEdge(int v, int w)
{
adj[v].push_back(w);
adj[w].push_back(v);
}
int BFS(int exit, vector<int> policepath)
{
queue<int> queue;
vector<bool> visited(N, false);
vector<int> distance(N, INT_MAX);
int min_path = INT_MAX;
visited[0] = true;
distance[0] = 0;
queue.push(0);
while (!queue.empty())
{
int s = queue.front(); queue.pop();
for (auto v : adj[s])
{
if (visited[v]) continue;
distance[v] = distance[s] + 1;
int police_index = (distance[v] % policepath.size());
bool occupied = (v == policepath[police_index]);
if (occupied)
distance[v]++;
if (v == exit)
min_path = min(min_path, distance[v]);
else
visited[v] = true;
queue.push(v);
}
}
return min_path;
}
};
int main()
{
int N, M, L;
cin >> N >> M >> L;
vector<int> A(M), B(M);
for (int i = 0; i < M; ++i) cin >> A[i] >> B[i];
vector<int> C(L);
for (auto &x : C) cin >> x;
Graph g = Graph(N);
for(int i = 0; i < M; i++)
g.addEdge(A[i], B[i]);
cout << g.BFS(N-1, C) << endl;
return 0;
}
Grazie in anticipo per l’aiuto .