二分+SPFA hack#3WA求调
查看原帖
二分+SPFA hack#3WA求调
655185
Nullity_Silence楼主2023/12/17 21:11

如题:

本人用的邻接表,数组稀烂,不知道问题在哪里

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

const int inf=0x3f3f3f3f;
const int N=1e4+10;
const int M=1e5+10;

int n,m,B,idx;
int f[N],h[N],e[M],ne[M],w[M],dist[N],st[N],p[N],pw[N];

void add(int a,int b,int c)
{
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx;
	idx++;
	return;
}

bool spfa(int x)
{
	queue<int> q;
	memset(dist,0x3f,sizeof(dist));
	memset(st,0,sizeof(st));
	memset(pw,0x3f,sizeof(pw));
	for(int i=1;i<=n;i++)
		p[i]=i;
	q.push(1);
	st[1]=1;
	dist[1]=0;
	while(!q.empty())
	{
		int t=q.front();
		st[t]=0;
		q.pop();
		for(int i=h[t];i!=-1;i=ne[i])
		{
			int j=e[i];
			if(x>=f[j]&&dist[j]>dist[t]+w[i])
			{
				dist[j]=dist[t]+w[i];
				p[j]=t;
				pw[j]=w[i];
				if(!st[j])
					q.push(j);
			}
		}
	}
	// for(int i=1;i<=n;i++)
	// 	cout<<p[i]<<' ';
	// cout<<endl;
	int cnt=0;
	for(int i=n;i!=1;i=p[i])
	{
		cnt+=pw[i];
		if(cnt>B)
			return 0;
	}
	return 1;
}

int main()
{
	int Max=0;
	memset(h,-1,sizeof(h));
	cin>>n>>m>>B;
	for(int i=1;i<=n;i++)
	{
		cin>>f[i];
		Max=max(Max,f[i]);
	}
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	if(!spfa(inf))
	{
		cout<<"AFK"<<endl;
		return 0;
	}
	int l=0,r=Max,mid,res;
	while(l<=r)
	{
		mid=l+((r-l)>>1);
		if(spfa(mid))
		{
			res=mid;
			r=mid-1;
		}
		else
			l=mid+1;
	}
	cout<<res<<endl;
	return 0;
}
2023/12/17 21:11
加载中...