社区讨论
样例已过,其他全部输出afk求调qaq
P1462通往奥格瑞玛的道路参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m3dwexb7
- 此快照首次捕获于
- 2024/11/12 11:34 去年
- 此快照最后确认于
- 2025/11/04 14:52 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define Pair pair<ull,int>
#define ull unsigned long long
using namespace std;
int n,m;
ull b;
int fee[10004];
int head[10005];
struct Edge
{
int nxt,to;
ull len;
}edge[100005];
int tot=0;
void add(int from,int to,ull len)
{
tot++;
edge[tot].len=len;
edge[tot].nxt=head[from];
edge[tot].to=to;
head[from]=to;
}
ull dis[10005];
bool vis[10005];
priority_queue<Pair,vector<Pair>,greater<Pair> >q;
bool check(int maxf)
{
for(int i=1;i<=n;i++)
dis[i]=-1;
memset(vis,0,sizeof(vis));
while(q.empty()==0)
q.pop();
dis[1]=0;
q.push(make_pair(0,1));
while(q.empty()==0)
{
int now=q.top().second;
q.pop();
if(vis[now])
continue;
vis[now]=1;
if(dis[now]>b)
return 0;
else if(now==n)
return 1;
for(int i=head[now];i;i=edge[i].nxt)
{
int np=edge[i].to;
if(fee[np]>maxf)
continue;
if(vis[np])
continue;
if(dis[now]+edge[i].len<dis[np])
{
dis[np]=dis[now]+edge[i].len;
q.push(make_pair(dis[np],np));
}
}
}
if(dis[n]<=b)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int maxn=0;
scanf("%d%d%llu",&n,&m,&b);
for(int i=1;i<=n;i++)
{
scanf("%d",&fee[i]);
maxn=max(maxn,fee[i]);
}
for(int i=1;i<=m;i++)
{
int x,y;
ull z;
scanf("%d%d%llu",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
int l=fee[1],r=maxn;
bool flag=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
{
flag=1;
r=mid-1;
}
else
{
l=mid+1;
}
}
if(flag)
cout<<r+1;
else
cout<<"AFK";
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...