孩子快疯了,有大佬帮忙看看我spfa错哪里了吗
查看原帖
孩子快疯了,有大佬帮忙看看我spfa错哪里了吗
211897
weconyed楼主2022/10/31 23:10
#include<bits/stdc++.h>
using namespace std;
long long n,m,b;

long long f[10005];

struct ed{
	long long to,nxt,val;
}e[100005];

long long head[10005],cnt=0;

void add(long long x,long long y,long long v){
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	e[cnt].val=v;
	head[x]=cnt; 
}

long long dis[10005],st[10005];
queue<long long> qu;
long long spfa(long long fm){
	memset(dis,0x3f3f3f,sizeof(dis));
	dis[1]=0,st[1]=1;
	qu.push(1);
	while(!qu.empty()){
		long long tmp=qu.front();
		qu.pop();
		st[tmp]=0;
		for(long long i=head[tmp];i;i=e[i].nxt){
			long long y=e[i].to;
			if(dis[tmp]+e[i].val<dis[y]){
				dis[y]=dis[tmp]+e[i].val;
				if(!st[y]&&f[y]<=fm){
					qu.push(y);
					st[y]=1;
				}
			}	
		}
	}
	if(dis[n]>=b) return 0;
	else return 1;
}
int main(){
	cin>>n>>m>>b;
	long long l,r=0;
	for(long long i=1;i<=n;i++){
		cin>>f[i];
		r=max(f[i],r);
	}
	l=max(f[1],f[n]);
	for(long long i=1;i<=n;i++){
		long long x,y,v;
		cin>>x>>y>>v;
		if(x==y) continue;
		add(x,y,v);
		add(y,x,v);
	}
	if(!spfa(2000000005)){
		cout<<"AFK";
		return 0;
	}
	//if(!spfa(723502837))  cout<<"mdzz";
	while(l<=r){
		long long mid=(l+r)/2;
		if(spfa(mid)) r=mid-1;
		else l=mid+1;
	}
	cout<<l;
	return 0;
} 
2022/10/31 23:10
加载中...