WA#5#8求助
查看原帖
WA#5#8求助
195331
Mine_KingCattleya楼主2020/8/24 15:50

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

2020/8/24 15:50
加载中...