zoukankan      html  css  js  c++  java
  • luogu P5001 魔法祝福

    题目描述

    宝塔有nn层,A向一个dalao购买了魔法,可以从第xx层跳到第yy层,也可以从第yy层跳到xx层。但每种魔法都有诅咒和一个分值kk,每使用一次魔法,会用tt个单位的时间,也就会得到一个诅咒,如果你的诅咒数大于等于这个魔法的分值kk,那么这个魔法就不能使用了(在这之前魔法无限使用)。AA的初始诅咒值为-1。 AA被dalao强制使用了一次魔法(AA本身不会这个魔法),从第一层跳到了第pp层(pp可以是1)。望眼四周,空空如也,没有路。要到达遥远的第qq层,好像只能编程了吧。输出最少到达所需的时间。如果到天荒地老都到不了,输出“bao 0”(不包含单引号)。


    感天动地的SPFA,在模板中改一点就行

    要加上的就是每次出现能将时间更新到更优的也要进行扩展

     但是为什么卡了我一个下午呢?

    这道题的数据不知道有什么问题,会把read卡掉

    一下午每次提交都会T四个点,找了标程对拍都没用,我只想说一句,出数据要走心呐!!!

    下面给出代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    inline int rd(){
        int x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        return x*f;
    }
    inline void write(long long x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) write(x/10);
        putchar(x%10+'0');
        return ;
    }
    int n,m;
    int head[4000006];
    int nxt[4000006];
    int to[4000006];
    long long v[4000006];
    int u[4000006];
    int total=0;
    inline void add(int x,int y,int z,int f){
        to[++total]=y;
        v[total]=z;
        u[total]=f;
        nxt[total]=head[x];
        head[x]=total;
        return ;
    }
    int p,e;
    long long dis[4000006];
    int q[4000006],t[4000006],tm[4000006],l=0,r=0;
    long long inf=2147483646;
    inline void spfa(int x){
        for(int i=1;i<=n;i++) dis[i]=inf;
        q[++r]=x;
        t[r]=0;
        dis[x]=0,tm[x]=0;
        while(l<r){
            int h1=q[++l];
            int h2=t[l]+1;
            for(register int e=head[h1];e;e=nxt[e]){
                if((dis[to[e]]>dis[h1]+v[e]||tm[to[e]]>h2)&&h2<=u[e]){
                    if(dis[to[e]]>dis[h1]+v[e]){
                        dis[to[e]]=dis[h1]+v[e];
                        tm[to[e]]=h2;
                    }
                    q[++r]=to[e];
                    t[r]=h2;
                }
            }
        }
        return ;
    }
    int main(){
        //n=rd(),m=rd(),p=rd(),e=rd();
        n=rd(),m=rd(),p=rd(),e=rd();
        for(register int i=1;i<=m;i++){
            int x,y,z,f;
            cin>>x>>y>>z>>f;
            add(x,y,z,f),add(y,x,z,f);
        }
        spfa(p);
        if(dis[e]==inf) printf("bao 0");
        else write(dis[e]);
        return 0;
    }
  • 相关阅读:
    内存与缓存认识
    翻转字符串里的单词
    c++ STD Gems07
    C++ STD Gems06
    C++ STD Gems05
    Silverlight RIA Services基础专题
    超漂亮的WPF界面框架(Modern UI for WPF)
    实验三——阶乘
    实验二
    实验一 Java环境的搭建&Eclipse的安装
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9906290.html
Copyright © 2011-2022 走看看