Shirο @ 2020-11-25 21:23:34
思路 二分+spfa,感觉没大问题?
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e4+5;
const int maxx=1e18;
int n,m,b;
int cost[maxn],v[maxn],d[maxn];
vector< pair<int,int> > g[maxn];
void add(int u,int v,int w){g[u].push_back(make_pair(v,w));}
void spfa(int c)
{
fill(v+1,v+n+1,0);
fill(d+1,d+n+1,maxx);
queue<int>q;
d[1]=0,v[1]=1;q.push(1);
while(!q.empty())
{
int x=q.front();q.pop();
//if(cost[x]>c)continue;
for(int i=0;i<g[x].size();++i)
{
int y=g[x][i].first;
int z=g[x][i].second;
if(cost[y]>c)continue;
if(d[y]>d[x]+z)
{
d[y]=d[x]+z;
if(!v[y])q.push(y),v[y]=1;
}
}
}
}
bool check(int x)
{
spfa(x);
for(int i=1;i<=n;++i)cout<<d[i]<<' ';
cout<<endl;
//getchar();
return d[n]<=b;
}
signed main()
{
f//reopen("data.in","r",stdin);
cin>>n>>m>>b;
int l=maxx,r=0;
for(int i=1;i<=n;++i)cin>>cost[i],l=min(l,cost[i]),r=max(r,cost[i]);
for(int i=1;i<=m;++i)
{
int x,y,z;
cin>>x>>y>>z;
if(x==y) continue;
add(x,y,z);
add(y,x,z);
}
int ans=0;
if(!check(r))
{
cout<<"AFK";
return 0;
}
while(l<=r)
{
int mid=(l+r)>>1;
//cout<<l<<' '<<r<<endl;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
}
by BFqwq @ 2020-11-25 21:26:21
你 check 函数里为什么有输出啊
by BFqwq @ 2020-11-25 21:26:31
@万岁小姐姐
by Shirο @ 2020-11-25 21:26:51
@世界第一肥宅BF 抱歉,作为调试
请自动忽略
by 银杉水杉秃杉 @ 2020-11-25 21:29:53
很明显spfa要爆,建议dijkstra+优先队列
都0202年了,SPFA已死,dijkstra当立
by 是个汉子 @ 2020-11-25 21:29:58
这不是dij吗
by BFqwq @ 2020-11-25 21:30:59
这跟最短路写法没关系吧(
看着思路好像没啥问题(
by Light_snow @ 2020-11-25 21:44:31
用dij吧 这题应该卡spfa
spfa和dij是不同的算法 所以面对不同的数据效率不一样
by Shirο @ 2020-11-25 21:48:32
@银杉水杉秃杉 @Dix_
spfa过了,原因是没把v[x]清回0