题意:
给你一个有向图,然后再给你一条路径,每次最短路的路径变化的话会重新导航,让你求出在这条路径上重新导航次数的最小值和最大值。
反向建图求出终点到每个点的最短路即可。
AC代码:
const int N = 4e5 + 5;
const int inf = 0x7ffffff;
vector<int> g1[N];
vector<int> g2[N];
queue<int> q;
int n, m, k;
int dis[N], op[N];
int ans1, ans2;
void bfs(int x)
{
dis[x] = 0;
q.push(x);
while (!q.empty())
{
int now = q.front();
q.pop();
for (auto v : g2[now])
if (dis[v] == inf)
dis[v] = dis[now] + 1, q.push(v);
}
}
int main()
{
sdd(n, m);
rep(i, 1, m)
{
int u, v;
sdd(u, v);
g1[u].pb(v);
g2[v].pb(u);
}
sd(k);
rep(i, 1, k)
sd(op[i]);
rep(i, 1, n)
dis[i] = inf;
bfs(op[k]);
ans1 = 0, ans2 = 0;
rep(i, 1, k - 1)
{
bool flag = false, ok = false;
for (auto v : g1[op[i]])
if (v != op[i + 1])
{
if (dis[v] == dis[op[i + 1]])
ok = true;
if (dis[v] < dis[op[i + 1]])
flag = true;
}
if (flag)
ans1++, ans2++;
else if (ok)
ans1++;
}
pdd(ans2, ans1);
return 0;
}