Mine_King @ 2020-08-24 15:50:48
RT,数据在此,代码如下:
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
long long hp,money[10005];
long long l,r,v[10005];
bool f[10005];
struct node
{
long long first;
int second;
friend bool operator<(node x,node y){return x.first>y.first;}
};
priority_queue<node>q;
struct graph
{
int tot;
int hd[10005];
int nxt[50005],to[50005];
long long dt[50005];
void add(int u,int v,long long w)
{
tot++;
nxt[tot]=hd[u];
hd[u]=tot;
to[tot]=v;
dt[tot]=w;
return ;
}
}g;
bool check(long long x)
{
if(money[1]>x) return false;
memset(f,0,sizeof(f));
memset(v,0x3f,sizeof(v));
q.push((node){0,1});
v[1]=0;
while(!q.empty())
{
int xx=q.top().second;
q.pop();
if(!f[xx])
{
f[xx]=true;
for(int i=g.hd[xx];i;i=g.nxt[i])
if(money[g.to[i]]<=x&&v[g.to[i]]>v[xx]+g.dt[i])
{
v[g.to[i]]=v[xx]+g.dt[i];
q.push((node){v[g.to[i]],g.to[i]});
}
}
}
return v[n]<hp;
}
int main()
{
scanf("%d%d%lld",&n,&m,&hp);
for(int i=1;i<=n;i++)
{
scanf("%lld",&money[i]);
if(r<money[i]) r=money[i];
}
for(int i=1;i<=m;i++)
{
int u,v;
long long w;
scanf("%d%d%lld",&u,&v,&w);
g.add(u,v,w);
}
while(l<r)
{
long long mid=(l+r)/2;
printf("%lld %lld %lld\n",l,r,mid);
if(check(mid)) r=mid;
else l=mid+1;
}
if(check(r)) printf("%lld",r);
else printf("AFK\n");
return 0;
}
求大佬帮忙查错/kel,应该是dijkstra(check)挂了,但我照不出来/kk
by Lynkcat @ 2020-08-24 16:01:49
我怀疑是你二分答案写错了,check我貌似没看出来错误(为什么不写l小于等于r那种二分
by Lynkcat @ 2020-08-24 16:03:31
等等v等于hp的时候也是可以到达的吧……
by Water_Cows @ 2020-08-24 16:07:27
试过了,没用的。。。。
by Lynkcat @ 2020-08-24 16:14:32
@Water_Cows v等于hp试过了也没用吗
by Water_Cows @ 2020-08-24 16:15:04
你看看我的提交记录就知道了。。。。。。((
by Lynkcat @ 2020-08-24 16:15:34
而且这东西貌似是个无向图吧为什么只add了一次
by Mine_King @ 2020-08-24 16:17:54
@LYC_music 草我瞎了,谢谢LYC聚聚/qq
by Water_Cows @ 2020-08-24 16:19:52
....................... MK 可以了。。。。
@Mine_King 下次记得看题。。。。。
by Water_Cows @ 2020-08-24 16:20:36
突然发现我的提交记录好像有一页了。。。。