博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3662电缆
阅读量:6863 次
发布时间:2019-06-26

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

题目:

二分答案。然后边权>mid的边的边权2记为1,否则记为0。找一个边权2的最短路,看dis[n]是否<=K。

别忘了不能到达要输出-1。

#include
#include
#include
#include
#define ll long longusing namespace std;const int N=1005,M=10005,INF=16843009;int n,m,head[N],xnt,dis[N],K;ll l,r,ans;bool vis[N];struct Edge{ int next,to;ll w;bool c; Edge(int n=0,int t=0,ll w=0,bool c=0):next(n),to(t),w(w),c(c) {}}edge[M<<1];void add(int x,int y,int z){ edge[++xnt]=Edge(head[x],y,z,0);head[x]=xnt; edge[++xnt]=Edge(head[y],x,z,0);head[y]=xnt;}bool dj(){ memset(dis,1,sizeof dis); memset(vis,0,sizeof vis); priority_queue
,vector
>,greater
> > q; dis[1]=0;q.push(make_pair(0,1)); while(q.size()) { int k=q.top().second;q.pop(); while(vis[k]&&q.size())k=q.top().second,q.pop(); if(vis[k])break;vis[k]=1; for(int i=head[k],v;i;i=edge[i].next) if(dis[k]+edge[i].c
>1); for(int i=1;i<=xnt;i++) { if(edge[i].w>mid)edge[i].c=1; else edge[i].c=0; } if(dj())ans=mid,r=mid-1; else l=mid+1; } if(dis[n]==INF)ans=-1; printf("%lld",ans); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/8932784.html

你可能感兴趣的文章