【CF1307D】牛およびフィールド - 貪欲、BFS、最短

無向グラフ、全体の右側にユニコムKキー、最短の1〜n個のエッジ後の最大のポイント加算を求める鍵選択ものがである、請求

解決

(1、N \)\最短BFSアレイから出発し、それぞれと呼ばれる\([]、B [ ] \)

よれば、特別な点(X_I \)\昇順には、それはそれぞれのために、表示することは容易ではない(\ X_I)を\のみ考慮する必要があり(Y_ {iは、+ 1} \ \) に

#include <bits/stdc++.h>
using namespace std;

const int N = 200005;
vector <int> g[N];
int n,m,k,a[N],x[N],y[N],v[N],t1,t2;

bool cmp(int p,int q) {
    return x[p]<x[q];
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++) cin>>a[i];
    for(int i=1;i<=m;i++) {
        cin>>t1>>t2;
        g[t1].push_back(t2);
        g[t2].push_back(t1);
    }
    queue <int> qu;
    memset(x,0x3f,sizeof x);
    x[1]=0;
    qu.push(1);
    while(qu.size()) {
        int p=qu.front();
        qu.pop();
        for(int q:g[p]) {
            if(x[q]>x[p]+1) {
                x[q]=x[p]+1;
                if(v[q]==0) v[q]=1,qu.push(q);
            }
        }
    }
    memset(y,0x3f,sizeof x);
    memset(v,0,sizeof v);
    y[n]=0;
    qu.push(n);
    while(qu.size()) {
        int p=qu.front();
        qu.pop();
        for(int q:g[p]) {
            if(y[q]>y[p]+1) {
                y[q]=y[p]+1;
                if(v[q]==0) v[q]=1,qu.push(q);
            }
        }
    }
    sort(a+1,a+k+1,cmp);
    int s=0;
    for(int i=1;i<k;i++) {
        s=max(s,min(x[n],min(x[a[i]]+y[a[i+1]],y[a[i]]+x[a[i+1]])+1));
    }
    cout<<s;
}

おすすめ

転載: www.cnblogs.com/mollnn/p/12610655.html