社区讨论

82pts求助,性别未知

P1462通往奥格瑞玛的道路参与者 7已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi6z7q6a
此快照首次捕获于
2025/11/20 13:13
4 个月前
此快照最后确认于
2025/11/20 15:42
4 个月前
查看原帖
RT。不知道哪里错了qwq
CPP
//code by rainman,luogu P1462
#include<cstdio>
#include<queue>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define INF 0x7fffffff
using namespace std;

const int MAXN = 10000+10;
const int MAXM = 50000+10;
struct Edge{int v,w,next;}edge[MAXM<<1];
int tot,head[MAXN],n,m,b,l,r;
int f[MAXN],dis[MAXN];
bool inq[MAXN];

inline void addedge(int x,int y,int z)
{
	edge[++tot].v=y;
	edge[tot].w=z;
	edge[tot].next=head[x];
	head[x]=tot;
}

bool spfa(int cost)
{
	if(f[1]>cost)return false;
	for(int i=1;i<=n;i++)dis[i]=INF;
	queue<int> qwq; dis[1]=0;
	qwq.push(1); inq[1]=true;
	
	while(!qwq.empty())
	{
		int x=qwq.front();
		qwq.pop(); inq[x]=false;
		for(int i=head[x];i;i=edge[i].next)
		{
			int y=edge[i].v,hp=edge[i].w;
			if(dis[y]>dis[x]+hp&&f[y]<=cost)
			{
				dis[y]=dis[x]+hp;
				if(!inq[y]){
					qwq.push(y);
					inq[y]=true;
				}
			}
		}
	}
	if(dis[n]<b)return true;
	return false;
}

int main()
{
	scanf("%d%d%d",&n,&m,&b);
	for(int i=1;i<=n;i++)scanf("%d",&f[i]);
	for(int i=1;i<=n;i++)r=MAX(r,f[i]);
	for(int i=1;i<=m;i++)
	{
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		if(x==y)continue;
		addedge(x,y,z); addedge(y,x,z);
	}
	int temp=r;
	l=MAX(f[1],f[n]);
	
	if(!spfa(1001001000)){puts("AFK");return 0;}
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(spfa(mid))r=mid;
		else l=mid+1;
	}
	
	if(r==temp&&(!spfa(r)))puts("AFK");
	else printf("%d",r);
	return 0;
}

回复

13 条回复,欢迎继续交流。

正在加载回复...