zoukankan      html  css  js  c++  java
  • Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) D

    题意:

    有一个n个点m条边的有向图。给出一条其中路径经过k个点(k个不重复的点)

    起点是s,终点是t。在这个路径上的每个点时,导航系统都会给出这个点到t的其中一条最短路;

    如果这条最短路的下一个点 与 给出的路径下一个点不一样需要修改成到下一个点的位置,求最少的修改次数和最多的修改次数。

    样例
    6 9(6个点,9条边) 1 5 5 4 1 2 2 3 3 4 4 1 2 6 6 4 4 2 4(k个点,其中之一的路径) 1 2 3 4
    输出
    1 2


    因为1-4的最短路是1-5-4,所以1-2修改,因为2-4的最短路有两条系统可能给2-3-4或者2-6-4,所以最小修改是1,最大修改是2

    思路:
    因为需要要k个点到t最短路(有向图),所以用bfs跑t到所有点的最短距离;
    这些点(假设x)是否存在t到x点最短路径不同情况。如果有不同情况(如同样例2-4有两个可能)最大修改++;
    如果存在k个点之中相邻的两个不是最短路连接的(如同样例5-1,而k个点之中时2-1),那么最大和最小修改都要++。


    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define il inline
    #define it register int
    #define inf 0x3f3f3f3f
    #define lowbit(x) (x)&(-x)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mod 998244353
    const int maxn=2e5+10;
    struct node{
        int v,next;
    }a[maxn];
    vector<int>pan[maxn];
    struct node1{
        int x,bu;
        node1(){}
        node1(int xx,int buu):x(xx),bu(buu){}
        friend bool operator<(const node1 a,const node1 b){
            if(a.bu==b.bu){return a.x>b.x;}
            return a.bu>b.bu;
        }
    };
    int head[maxn],cnt,n,m,k,minnge,minbu,b[maxn],f,bu[maxn],ci[maxn];
    il void add(int v,int w){
        a[cnt].v=w;a[cnt].next=head[v];
        head[v]=cnt++;
    }
    il void bfs(int u,int buu){
        bu[u]=0;
        priority_queue<node1>q;
        q.push(node1(u,buu));
        while(!q.empty()){
            node1 tt=q.top();q.pop();
            int w=tt.x,bu2=tt.bu+1;
            for(it i=head[w];~i;i=a[i].next){
                int v=a[i].v;
                if(bu[v]==-1){
                    ci[v]++;bu[v]=bu2;pan[v].push_back(w);q.push(node1(v,bu2));
                }
                else if(bu[v]==bu2){
                    ci[v]++;pan[v].push_back(w);
                }
            }
        }
    }
    il bool pand(int u,int v){
        for(auto &i:pan[u]){
            if(i==v){return true;}
        }
        return false;
    }
    int main(){
        mem(head,-1);mem(bu,-1);
        scanf("%d%d",&n,&m);
        for(it i=0;i<m;i++){int v,w;
            scanf("%d%d",&v,&w);
            add(w,v);
        }
        scanf("%d",&k);
        int ma=0,mi=0;
        for(it i=0;i<k;i++){
            scanf("%d",&b[i]);
        }
        bfs(b[k-1],1);
        for(it i=0;i<k-1;i++){
            if(!pand(b[i],b[i+1])){
                mi++,ma++;
            }
            else{
                if(ci[b[i]]>1){ma++;}
            }
        }
        printf("%d %d
    ",mi,ma);
        return 0;
    }
    /*
    20 50
    2 3
    18 10
    11 6
    11 1
    18 17
    18 7
    15 20
    6 11
    11 2
    8 2
    14 2
    20 1
    1 19
    17 2
    5 17
    15 17
    19 12
    16 9
    12 4
    19 2
    2 19
    14 3
    6 5
    20 19
    2 16
    1 12
    2 12
    9 2
    13 18
    2 13
    10 4
    12 8
    12 3
    17 5
    18 12
    18 11
    2 17
    6 20
    19 20
    7 9
    3 2
    19 15
    10 20
    13 12
    4 3
    18 15
    13 9
    2 11
    19 14
    16 11
    8
    18 10 4 3 2 19 12 8
    */
  • 相关阅读:
    NaN数值类型
    模板字符串
    一文带你速懂虚拟化KVM和XEN
    CentOS 8配置本地yum源及DNF简介
    fxksmdb.exe 是什么进程?
    入行IT,一定要会Linux吗?
    干货|Linux平台搭建网关服务器
    忘带U盘了??别急!一行python代码即可搞定文件传输
    手把手教你如何搭建一个私有云盘
    误删重要文件怎么办?学会Linux 救援模式再也不担心
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/12395902.html
Copyright © 2011-2022 走看看