Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) D. Navigation System(有向图,BFS,最短路)
题意:
n 点 m 边有向图,给出行走路径,求行走途中到路径终点最短路变化次数的最小值和最大值 。
思路 :
逆向广搜,正向模拟。
#include <bits/stdc++.h> using namespace std; const int M=220000; vector<int> e1[M],e2[M]; int p[M],dis[M]; int main() { int n,m;cin>>n>>m; for(int i=0;i<m;i++){ int u,v;cin>>u>>v; e1[u].push_back(v); e2[v].push_back(u); } int k;cin>>k; for(int i=0;i<k;i++) cin>>p[i]; queue<int> q; q.push(p[k-1]); dis[p[k-1]]=1; while(!q.empty()){ int u=q.front(); q.pop(); for(int v:e2[u]){ if(dis[v]==0){ q.push(v); dis[v]=dis[u]+1; } } } int mi=0,mx=0; for(int i=0;i<k-1;i++){ if(dis[p[i]]!=dis[p[i+1]]+1) ++mi; for(int v:e1[p[i]]){ if(v!=p[i+1]&&dis[p[i]]==dis[v]+1){ ++mx; break; } } } cout<<mi<<' '<<mx<<endl; return 0; }