社区讨论

AFK on#8 WA on #6#11

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lw0bvjoh
此快照首次捕获于
2024/05/10 15:00
2 年前
此快照最后确认于
2024/05/10 18:26
2 年前
查看原帖
求大佬调
CPP

#include <bits/stdc++.h>
using namespace std;

const int N=1e4+5,M=5e4+5,F=1e9,INF=0x3f3f3f3f;
long long n,m,b,x,y,z,f[N],head[N],cnt,dis[N];
bool vis[N];
struct{
	long long v,nxt,w;
}edge[M*2];
struct Tmp{
	long long l,id;
	Tmp(long long l,long long id):l(l),id(id){}
}; 
bool operator< (Tmp a,Tmp b){
	return a.l<b.l;
}
priority_queue <Tmp> q;
//链式前向星 
void add(long long s,long long v,long long w){
	edge[cnt].v=v;
	edge[cnt].w=w;
	edge[cnt].nxt=head[s];
	head[s]=cnt++;
}
//Dijkstra
bool check(long long x){
	dis[1]=0;
	vis[1]=false;
	for(long long i=2;i<=n;i++){
		dis[i]=INF;
		vis[i]=false; 
	}
	q.push({0,1});
	while(!q.empty()){
		long long p=q.top().id;
		q.pop();
		if(vis[p]) continue;
		vis[p]=true;
		for(long long i=head[p];~i;i=edge[i].nxt){
			if(f[edge[i].v]>x) continue;
			if(dis[p]+edge[i].w<dis[edge[i].v]){
				dis[edge[i].v]=dis[p]+edge[i].w;
				q.push({dis[edge[i].v],edge[i].v});//把 dis[edge[i].v]改成 edge[i].w 反而不会AFK... 
			}
		}
	}
	if(dis[n]>b) return false;
	return true;
}
//二分 
long long find(long long l,long long r){
	if(l==r) return l;
	long long mid=(l+r)>>1;
	if(check(mid)) return find(l,mid);
	else return find(mid+1,r);
}

int main(){
	//freopen("P1462_6.in","r",stdin);
	memset(head,-1,sizeof(head));
	scanf("%lld%lld%lld",&n,&m,&b);
	for(long long i=1;i<=n;i++) scanf("%lld",&f[i]);
	for(long long i=1;i<=m;i++){
		scanf("%lld%lld%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,z); 
	}
	if(!check(F)) printf("AFK");
	else printf("%lld",find(f[1],F));
}

回复

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

正在加载回复...