80pts求助!
查看原帖
80pts求助!
1223436
ZHANG_SAN_Artanis楼主2024/8/7 20:02

WA on #6 #8
经测本地#6过了提交WA 以及为什么开O2全RE不开O2正常?

#include<bits/stdc++.h>
using namespace std;
#define MAXN 20005
#define INF 1e30
long long n,m,b,ans=INF;
long long f[MAXN],dis[MAXN];
int head[MAXN];
bool ok[MAXN];
int lu_n;
struct path{
	int nxt,to;
	long long dis;
}lu[10*MAXN];
void build(int u,int v,long long w)
{
	lu[++lu_n].to=v;
	lu[lu_n].dis=w;
	lu[lu_n].nxt=head[u];
	head[u]=lu_n;
}
struct node{
	int which;
	long long dis;
	bool operator <(const node &x)const
	{
		return x.dis<dis;
	}
};
priority_queue<node>q;
bool check(long long money)
{
	for(int i=1;i<=n;i++) dis[i]=INF;
	memset(ok,false,sizeof(ok));
	dis[1]=0;
	for(int i=1;i<=n;i++) if(f[i]>money)ok[i]=1;
	q.push({1,0});
	while(!q.empty())
	{
		node a=q.top();
		q.pop();
		int u=a.which;
		if(ok[u])continue;
		ok[u]=1;
		for(int i=head[u];i;i=lu[i].nxt)
		{
			long long w=lu[i].dis;
			int v=lu[i].to;
			if(f[i]<=money&&dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				q.push({v,dis[v]});
			}
		}
	}
	if(dis[n]==INF||dis[n]>b)return false;
	else return true;
}
int main()
{
	cin>>n>>m>>b;
	long long rt=INT_MIN,lt=INF;
	for(int i=1;i<=n;i++)
	{
		cin>>f[i];
		rt=max(rt,f[i]);
	}
	lt=f[n];
	for(int i=1;i<=m;i++)
	{
		int u,v;long long w;
		cin>>u>>v>>w;
		build(u,v,w);
		build(v,u,w);
	}
	while(lt<=rt)
	{
		long long mid=(lt+rt)>>1;
		if(check(mid))
		{
			ans=min(ans,mid);
			rt=mid-1;
		}
		else
		{
			lt=mid+1;
		}
	}
	if(ans)cout<<ans;
	else cout<<"AFK";
}
2024/8/7 20:02
加载中...