竞赛讨论区 > 外站救援
头像
ZKL_Aether_DASC
发布于 04-05 00:31 新疆
+ 关注

外站救援

https://kedaoi.cn/p/P3937

家人们RE了救救孩子吧

我的代码

#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;

const int M=205,N=10005;
int h[M],e[N],ne[N],w[N],idx;
int d[M];
bool u[M];

void add(int x,int y,int z){
    e[++idx]=y;
    w[idx]=z;
    ne[idx]=h[x];
    h[x]=idx;
}

int main(){
    int a,b,x,y;
    cin>>a>>b>>x>>y;
    memset(h,-1,sizeof h);
    for(int i=1;i<=100;i++){
        add(i,i+100,x);
        if(i>1) add(i,i-1+100,x);
        add(i+100,i,x);
        if(i<100) add(i+100,i+1+100,x);
    }
    for(int i=1;i<=100;i++){
        for(int j=1;j<=100;j++){
            int c=abs(i-j);
            add(i,j,c*y);
            add(i+100,j+100,c*y);
        }
    }
    memset(d,0x3f,sizeof d);
    d[a]=0;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
    q.push({0,a});
    while(q.size()){
        auto t=q.top();
        q.pop();
        int p=t.second;
        if(u[p]) continue;
        u[p]=1;
        for(int i=h[p];i!=-1;i=ne[i]){
            int j=e[i];
            if(d[j]>d[p]+w[i]){
                d[j]=d[p]+w[i];
                q.push({d[j],j});
            }
        }
    }
    cout<<d[b+100]<<endl;
    return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐