首页 > Web开发 > 详细

#SPFA#洛谷 4042 [AHOI2014/JSOI2014] 骑士游戏

时间:2020-01-16 09:39:38      阅读:109      评论:0      收藏:0      [点我收藏+]

题目


分析

如果我想普通攻击1,那么必须干掉所有产生的其它怪兽,这不由得可以用一个不等式来表示,

\(普攻+\sum need<法攻\)

但是所需要消灭的怪兽同样可以这样进行,所以它可能具有后效性,那不就是SPFA吗


代码

#include <cstdio>
#include <cctype> 
#include <queue>
#define rr register
using namespace std;
const int N=200011; long long dis[N],tur[N];
struct node{int y,next;}e[N*5],E[N*5];
int v[N],n,k=1,ls[N],hs[N]; queue<int>q;
inline long long iut(){
    rr long long ans=0; rr char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    return ans;
}
inline void add(int x,int y){
    e[++k]=(node){y,ls[x]},ls[x]=k;
      E[k]=(node){x,hs[y]},hs[y]=k;
}
signed main(){
    n=iut();
    for (rr int i=1;i<=n;++i){
        tur[i]=iut(),dis[i]=iut();
        for (rr int cnt=iut();cnt;--cnt) add(i,iut());
    }
    for (rr int i=1;i<=n;++i) v[i]=1,q.push(i);
    while (q.size()){
        rr int x=q.front(); q.pop(); v[x]=0;
        rr long long t=tur[x];
        for (rr int i=ls[x];i;i=e[i].next) t+=dis[e[i].y];
        if (t>=dis[x]) continue; dis[x]=t;
        for (rr int i=hs[x];i;i=E[i].next)
        if (!v[E[i].y]) v[E[i].y]=1,q.push(E[i].y);
    }
    return !printf("%lld",dis[1]);
}

#SPFA#洛谷 4042 [AHOI2014/JSOI2014] 骑士游戏

原文:https://www.cnblogs.com/Spare-No-Effort/p/12199492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!