• O


    题目大意:有一个导航系统,会根据你当前的位置,规划到目的地的最短路线,给你一个有向图,和一条行驶路径,问你导航重新规划路径的最大次数和最小次数。

    读题的时候题意特别不理解,何为最大次数,何为最小次数?

    1 比如说当在一个点时,到终点的最短路线就那一个,也就说我只能走这一条,不用重新规划。

    2 在一个点到终点的最短路径有多个,并且你下次要走的正好的其中的一个,这个时候,可以重新规划,也可以不重新规划。

    3 在一个点到终点最短的路径中,你下次要走的点不是其中的一个,这个时候必须重新规划。

    (有点绕,但是,,他就这么个意思)

    思路:首先我们应该知道每个点到终点的最短距离,所以---反向图跑最短路

               然后当在正向图中:

          对路径中的某个点x,如果下次要走的点是与x相邻的点中最短的,并且唯一,那么不用重新规划。

                    如果不唯一:可以重新规划,也可以不重新规划,所以maxx++.

                    如果下次要走的点不是与x相邻的点中最短的 ,必须重新规划。maxx++,minn++;

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2E5+7;
    const int INF=1e9+7;
    int p[N];
    int dis[N];
    bool mark[N];
    struct node{
        int x,y;
        bool friend operator<(const node x1,const node y1){
            return x1.y>y1.y;
        }
    };
    vector<node>mp1[N],mp2[N];
    void djstrea(int s){
        memset(mark,0,sizeof(mark));
        memset(dis,INF,sizeof(dis));
        priority_queue<node>que;
        dis[s]=0;
        que.push({s,0});
        while(que.size()){
            node xx=que.top();
            que.pop();
            if(mark[xx.x]==1) continue ;
            mark[xx.x]=1;
            for(int i=0;i<mp1[xx.x].size();i++){
                int dx=mp1[xx.x][i].x;
                int dy=mp1[xx.x][i].y;
                if(mark[dx]==0&&dis[dx]>dis[xx.x]+dy){
                    dis[dx]=dis[xx.x]+dy;
                    que.push({dx,dis[dx]});
                }
            } 
        }
    }
    int main(){
        int n,m;
        cin>>n>>m; 
        for(int i=1;i<=m;i++){
            int x,y;
            cin>>x>>y;
            mp1[y].push_back({x,1});
            mp2[x].push_back({y,1});
        }
        int k;
        cin>>k;
        for(int i=1;i<=k;i++) cin>>p[i];
        for(int i=1;i<=n;i++) dis[i]=INF;
        djstrea(p[k]); 
        int minn=0,maxx=0;
        for(int i=1;i<k;i++){
            int c=dis[p[i+1]]; 
            int cnt1=0,cnt2=0;
            int x1=p[i];
            for(int j=0;j<mp2[x1].size();j++){
                if(dis[mp2[x1][j].x]==c) cnt1++;
                if(dis[mp2[x1][j].x]<c)  cnt2++; 
            }
            if(cnt2!=0){
                minn++;
                maxx++;
            }
            else if (cnt1>1) maxx++;
        }
        cout<<minn<<" "<<maxx<<endl;
        return 0;
    }
  • 相关阅读:
    Mysql数据库相关流程图/原理图
    【nginx】配置Nginx实现负载均衡
    数据库设计——评论回复功能
    html生成pdf
    cmd下载echarts包
    windows安装cnpm步骤
    你不在,是一年一年,你在,是春夏秋冬
    聚合
    Beyond compare4密钥
    ExtJs目录说明
  • 原文地址:https://www.cnblogs.com/Accepting/p/12487414.html
Copyright © 2020-2023  润新知