洛谷1462 通往奥格瑞玛的道路 最短路&&二分
SPFA和二分的使用
跑一下最短路看看能不能回到奥格瑞玛,二分收费最多的点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define maxn 10005 #define maxm 50005 #define inf 2000000000 int n,m,b,cnt,ans; int c[maxn],dis[maxn]; int head[maxm]; bool vis[maxn]; struct edge{ int next,to,w; }e[maxm<<1]; void insert(int u,int v,int k){ cnt++; e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=k; head[u]=cnt; } bool spfa(int x){ queue<int> q; memset(vis,0,sizeof vis); memset(dis,0x3f,sizeof dis); vis[1]=1;dis[1]=0; q.push(1); while(!q.empty()){ int now=q.front(); q.pop();vis[now]=0; for(int i=head[now];i;i=e[i].next){ int k=e[i].to; if(c[k]>x)continue; if(dis[k]>dis[now]+e[i].w){ dis[k]=dis[now]+e[i].w; if(!vis[k]){ vis[k]=1; q.push(k); } } } } if(b-dis[n]<=0||dis[n]==inf)return 0; return 1; } int main(){ int l=0,r=0; scanf("%d%d%d",&n,&m,&b); for(int i=1;i<=n;i++){ scanf("%d",&c[i]); r=max(r,c[i]); } int u,v,k; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&k); insert(u,v,k); insert(v,u,k); } if(spfa(inf)){ int mid=(l+r)>>1; while(l<=r){ if(spfa(mid)){ r=mid-1; ans=mid; } else l=mid+1; mid=(l+r)>>1; } printf("%d\n",ans); } else printf("AFK\n"); return 0; }