博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Luogu】P1948电话线(二分SPFA)
阅读量:4584 次
发布时间:2019-06-09

本文共 1576 字,大约阅读时间需要 5 分钟。

  

  二分最长的电话线长度。把所有大于这个长度的边权设成1,小于等于的设成零,然后跑SPFA看dis[n]是否>k。若>k则l=mid+1

  否则r=mid-1

  放代码

#include
#include
#include
#include
inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f;}struct Edge{ int next,to,dis;}edge[1000010];int head[100100],num;inline void add(int from,int to,int dis){ edge[++num]=(Edge){head[from],to,dis}; head[from]=num;}int val[100010];int f[1000001],h,t=1;bool vis[100010];int dis[100010];int ans;int main(){ int n=read(),m=read(),k=read(); for(int i=1;i<=m;++i){ int from=read(),to=read(),dst=read(); add(from,to,dst); add(to,from,dst); val[i]=dst; } std::sort(val+1,val+m+1); int l=1,r=m; while(l<=r){ int mid=(l+r)>>1; int cost=val[mid]; memset(vis,0,sizeof(vis)); memset(dis,127/3,sizeof(dis)); f[1]=1;h=0;t=1;dis[1]=0; while(h++
dis[from]+c){ dis[to]=dis[from]+c; if(!vis[to]){ vis[to]=1; f[++t]=to; } } } } if(dis[n]>k) l=mid+1; else{ ans=cost; r=mid-1; } } printf("%d",ans==0?-1:ans); return 0;}

 

转载于:https://www.cnblogs.com/cellular-automaton/p/7566593.html

你可能感兴趣的文章
jquery的DataTables插件的使用方法
查看>>
合并果子 2004年NOIP全国联赛普及组
查看>>
九度1457...
查看>>
重新开始学习javase_Exception
查看>>
排序命令sort
查看>>
Raspberry Pi开发之旅-同步时间
查看>>
Spinner的使用
查看>>
9. configparser 设置配置文件模块
查看>>
Servlet的生命周期
查看>>
统计文本单词个数,并个数大小按序排列 C#
查看>>
maven setting仓库镜像
查看>>
如何让HTML的编写更具结构性
查看>>
在实际的运用中,我经常遇到需要对基础表的数据进行筛选后再进行行转列
查看>>
UVALive 6560 The Urge to Merge
查看>>
菜鸟简述Jquery中Ajax发送post请求及XML响应
查看>>
Codeforces Round #269 (Div. 2) D. MUH and Cube Walls KMP
查看>>
HDU 4251 The Famous ICPC Team Again 主席树
查看>>
POJ 2774 Long Long Message 后缀数组
查看>>
datagrid中设置编辑,删除列是否可以访问
查看>>
Linux下I/O复用 Select与Poll
查看>>