Nullity_Silence @ 2023-12-17 21:11:49
如题:
本人用的邻接表,数组稀烂,不知道问题在哪里
#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;
}
by Nullity_Silence @ 2023-12-17 21:33:04
解决了
——十年OI一场空,不开longlong见祖宗