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;
}

 

posted @ 2020-03-18 20:22  Kanoon  阅读(173)  评论(0编辑  收藏  举报