首页 > 其他分享 >Codeforces Round #621 (Div. 1 + Div. 2) D

Codeforces Round #621 (Div. 1 + Div. 2) D

时间:2022-11-24 00:23:38浏览次数:39  
标签:621 int Codeforces bfs push Div d2 d1

D. Cow and Fields

对于每个点 我们可以通过两次bfs求出 他离1最近的距离和离n最近的距离
对于连边就是 让d1[i]+d2[j]+1去更新最短路
我们要让d1[i]+d2[j]+1最大
我们先直接sort出来 发现第二个样例都过不了 原来是d1[i]+d2[j]可能在一条线上
我们如何才让d1[i]+d2[j]一定是i离1最近 j离n最近
我们直接按d1[i]进行排序
这样我们d1[i]的右边一定是离1更远的(要是d1值一样 但肯定不在一条链上 所以也是合法的)
所以我们直接求出一个后缀max关于d2的
然后扫一遍就可以了

int n,m,k,a[N];
vector<int>g[N];
void bfs(int u,int d1[]){
    queue<int>q;
    q.push(u);
    d1[u]=0;
    while(q.size()){
        auto t=q.front();
        q.pop();
        for(auto v:g[t]){
            if(!d1[v]&&v!=u){
                d1[v]=d1[t]+1;
                q.push(v);
            }
        }
    }
}
void solve(){
    cin>>n>>m>>k;
    int d1[N]={0},d2[N]={0};
    for(int i=1;i<=k;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        int a,b;cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    bfs(n,d1);
    bfs(1,d2);
    vector<pair<int,int>>v1;
    for(int i=1;i<=k;i++){
        v1.push_back({d1[a[i]],d2[a[i]]});
    }
    sort(all(v1));
    vector<int>mx(k+1);
    for(int i=k-1;i>=0;i--)
        mx[i]=max(mx[i+1],v1[i].second);
    int ans=-INF;
    for(int i=0;i<k-1;i++)
        ans=max(ans,mx[i+1]+v1[i].first);
    cout<<min(d1[1],ans+1)<<endl;
}

标签:621,int,Codeforces,bfs,push,Div,d2,d1
From: https://www.cnblogs.com/ycllz/p/16920598.html

相关文章

  • Codeforces Round #771 (Div. 2) E Colorful Operations
    ColorfulOperations珂朵莉树+树状数组||线段树单独维护点当前的值\(val\)和当前颜色的值\(tag\)这样就可以分开维护颜色和点的值,把复杂的操作\(2\)变成\(O(......
  • Codeforces Round #804 (Div. 2) C D
    C1700D2300所以我并没有做水题。考虑0的位置一定不动再考虑1的位置也不动考虑2的位置不妨设0的位置为L1的位置为R那么若2的位置在L~R之间那么2就可以随便放......
  • Public NOIP Round #3(Div. 1) 题解
    T2:先判\(1,n\)有连边的情况,也就是说明最短路一定是\(1\)直接走到\(n\)。特判掉\(k=1,n=2\)的情况,这是无解的。那么如果\(k\ge2\)就令\(1,n\)都为\(U\),其余随......
  • Codeforces Round #835 (Div. 4) A-G完全题解
    比赛链接A、点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intT;cin>>T;while(T--){vector<int>G;for(inti=1;......
  • Codeforces Round #831 (Div. 1 + Div. 2)
    C核心思路:这个题目其实是一个规律题,它有一个很重要的前提,那就是在分配方案最优的情况下,要不然我们直接选几个差值最大的就ok,那他这句话,其实我们结合几个样例就知道,有一个......
  • Codeforces Round #790 (Div.4) A-H2题解
    原题链接:https://codeforces.com/contest/1676A.Lucky?题意:给定长度为6由数字组成的字符串问前三个数字的和是否等后三个数字的和。题解:直接相加比较即可。#include<......
  • Codeforces Round #835 (Div.4) A-G题解
    原题链接:https://codeforces.com/contest/1744A.MediumNumber题意:给定三个数,求中间那个数(倒数第二小or倒数第二大)。题解:直接用数组存,sort一下输出中间的数即可。#in......
  • Educational Codeforces Round 36 (Rated for Div. 2) E Physical Education Lessons
    PhysicalEducationLessons珂朵莉树模板#include<iostream>#include<cstdio>#include<set>usingnamespacestd;#defineItset<ran>::iteratorstructran{......
  • Codeforces Round #449 (Div. 1) C Willem, Chtholly and Seniorious
    Willem,ChthollyandSeniorious珂朵莉树慕名而来操作\(3\)直接排序是我没想到的,因为随机数据所以才能过吧\(split\)操作中忘了开\(longlong\),\(wa3\)#include<......
  • Codeforces Global Round 23 D
    D.PathsontheTree思考问题我们发现我们路径总是可以走到底的而不会中途中断而且对于每一个分叉点也就是每个儿子至少都会有当前还剩的k/儿子数取余剩下的我们可以......