博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
阅读量:6983 次
发布时间:2019-06-27

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

对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<=K。

#include
#include
#include
using namespace std;#define N 1001#define M 10001int n,m,K,Xs[M],Ys[M],Zs[M];int first[N],next[M<<1],v[M<<1],en;bool w[M<<1];void AddEdge(int U,int V,bool W){ v[++en]=V; w[en]=W; next[en]=first[U]; first[U]=en;}queue
q;bool inq[N];int d[N];void spfa(){ memset(d,0x7f,sizeof(int)*(n+1)); d[1]=0; q.push(1); inq[1]=1; while(!q.empty()) { int U=q.front(); for(int i=first[U];i;i=next[i]) if(d[v[i]]>d[U]+w[i]) { d[v[i]]=d[U]+w[i]; if(!inq[v[i]]) {q.push(v[i]); inq[v[i]]=1;} } q.pop(); inq[U]=0; }}bool check(int x){ en=0; memset(first,0,sizeof(int)*(n+1)); for(int i=1;i<=m;++i) {AddEdge(Xs[i],Ys[i],Zs[i]>x); AddEdge(Ys[i],Xs[i],Zs[i]>x);} spfa(); return d[n]<=K;}int main(){ scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=m;++i) scanf("%d%d%d",&Xs[i],&Ys[i],&Zs[i]); int l=0,r=1000001; while(r>l) { int mid=(l+r>>1); if(check(mid)) r=mid; else l=mid+1; } printf("%d\n",l<=1000000?l:(-1)); return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/4440902.html

你可能感兴趣的文章
Proguard打包混淆报错:can't find superclass or interface
查看>>
2014美团笔试之寻找最短子串
查看>>
Open Flash Charts
查看>>
pycharm中不能安装bs4的解决方案
查看>>
我对编程语言选择的理解
查看>>
6.3、Android Studio的CPU Monitor
查看>>
【java】JDK1.8时间日期库 新特性 所有java中时间Date的使用
查看>>
Android 应用开发者必看的 9 个 Tips
查看>>
关于Fragment框架,说的够清晰了。。。
查看>>
批处理写的俄罗斯方块
查看>>
ubuntu下安装加装DNS
查看>>
线性回归——最小二乘法_实例(二)
查看>>
POJ2866:Who Gets the Most Candies?(线段树 + 反素数 + 约瑟夫环)
查看>>
微信支付开发(12) 认清微信支付v2和v3
查看>>
k8s学习笔记之三:k8s快速入门
查看>>
SpringBoot慕课学习-SpringBoot开发常用技术整合
查看>>
即将毕业的一些感想
查看>>
iframe 解决跨域问题
查看>>
The existing index has no NexusIndexer descriptor
查看>>
界面收缩和扩展
查看>>