题解 D 刺客信条

刺客信条

https://ac.nowcoder.com/acm/contest/6607/D

很明显是一道最短路的题,可以用迪杰斯特拉算法求解。

可以把每一个点拆成入点和出点,入点向出点连点权的边。

从 S 的出点开始跑最短路,求出到 T 的入点的最短路即可。

#include<bits/stdc++.h>
#define re 
using namespace std;
inline int read(){
    re int t=0;re char v=getchar();
    while(v<'0')v=getchar();
    if(v=='S'||v=='E')return v+100;
    if(v>='A')return 100;
    while(v>='0')t=(t<<3)+(t<<1)+v-48,v=getchar();
    return t;
}
int n,ans,m,val[32][32],head[20002],cnt;
struct edge{
    int to,next,w;
}e[300002];
inline void add(re int x,re int y,re int w){
    e[++cnt]=(edge){y,head[x],w};
    head[x]=cnt;
}
inline int pos(re int x,re int y){
    return (x-1)*m+y;
}
struct node{
    int pos,dis;
    bool operator <(const node x)const{
        return dis>x.dis;
    }
}h[50002];
priority_queue <node> q;
bool v[50005];
inline void dis(re int s){for(re int i=1;i<=2*m*n;++i)h[i].dis=1e9,h[i].pos=i;
    h[s].dis=0;
    q.push(h[s]);
    while(!q.empty()){
        while((h[q.top().pos].dis<q.top().dis)){q.pop();if(q.empty())break;
        }
        if(q.empty())break;
        node tmp=q.top();
        q.pop();
        for(re int i=head[tmp.pos];i;i=e[i].next){
            if((tmp.dis+e[i].w)<h[e[i].to].dis){
                h[e[i].to].dis=tmp.dis+e[i].w;
                q.push(h[e[i].to]);
            }
        }

    }
}
signed main(){
    n=read();m=read();
    for(re int i=1;i<=n;++i)for(re int j=1;j<=m;++j)val[i][j]=read();
    for(re int i=1;i<=n;++i){
        for(re int j=1;j<=m;++j){
            add(pos(i,j),pos(i,j)+n*m,val[i][j]);
            if(i!=1)add(pos(i,j)+n*m,pos(i-1,j),0);
            if(j!=1)add(pos(i,j)+n*m,pos(i,j-1),0);
            if(i!=n)add(pos(i,j)+n*m,pos(i+1,j),0);
            if(j!=m)add(pos(i,j)+n*m,pos(i,j+1),0);
            //printf("%d %d %d\n",i,j,val[i][j]);
        }
    }
    for(re int i=1;i<=n;++i)for(re int j=1;j<=m;++j)if(val[i][j]==100+'S')dis(pos(i,j)+n*m);
    for(re int i=1;i<=n;++i)for(re int j=1;j<=m;++j)if(val[i][j]==100+'E')printf("%d",h[pos(i,j)].dis);
}
全部评论

相关推荐

12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务