SPFA和二分的使用

跑一下最短路看看能不能回到奥格瑞玛,二分收费最多的点

#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<<];
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,,sizeof vis);
memset(dis,0x3f,sizeof dis);
vis[]=;dis[]=;
q.push();
while(!q.empty()){
int now=q.front();
q.pop();vis[now]=;
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]=;
q.push(k);
}
}
}
}
if(b-dis[n]<=||dis[n]==inf)return ;
return ;
}
int main(){
int l=,r=;
scanf("%d%d%d",&n,&m,&b);
for(int i=;i<=n;i++){
scanf("%d",&c[i]);
r=max(r,c[i]);
}
int u,v,k;
for(int i=;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)>>;
while(l<=r){
if(spfa(mid)){
r=mid-;
ans=mid;
}
else l=mid+;
mid=(l+r)>>;
}
printf("%d\n",ans);
}
else printf("AFK\n");
return ;
}

最新文章

  1. 关于安卓工程导出带res资源文件的jar的总结
  2. C/C++实践笔记_001Helloworld
  3. NIO中Selector分析
  4. js数组与字符串的相互转换方法
  5. C++重要知识点小结---1
  6. js学习笔记第二篇
  7. 【HDOJ】3337 Guess the number
  8. 《Linear Algebra and Its Applications》-chaper3-行列式-行列式初等变换
  9. sqlserver 进行MD5加密
  10. Twenty Newsgroups Classification实例任务之TrainNaiveBayesJob(一)
  11. Hadoop-2.6.5安装
  12. windows远程桌面神器
  13. .NET Core----七牛云图片上传
  14. SQL 获取表结构
  15. flask实战-留言板-Web程序开发流程
  16. 在vue中使用watch监听对象或数组
  17. webpack中 resolve.alias 配置,@import相关踩坑
  18. html5学习笔记3——高级特性
  19. 移动端(微信等)使用 vConsole 调试 console
  20. Cache Server

热门文章

  1. JavaScript实现记住密码功能
  2. 【记录】Linux安装JDK详细步骤
  3. hdu 2037 - 典型贪心*
  4. php 添加redis扩展
  5. js产生随机数的几个方法
  6. TP框架传值
  7. GDOI2017 再次酱油记
  8. luogu P4139 上帝与集合的正确用法(扩展欧拉定理)
  9. Django之ORM的增删改查
  10. [洛谷P2183]巧克力