比赛 |
不准粘代码,必须自己写(HS除外) |
评测结果 |
AAAAAAAAAA |
题目名称 |
电话网络 |
最终得分 |
100 |
用户昵称 |
leon |
运行时间 |
0.212 s |
代码语言 |
C++ |
内存使用 |
15.66 MiB |
提交时间 |
2019-09-23 20:35:58 |
显示代码纯文本
#include <cstring>
#include <cstdio>
#include <cctype>
#include <queue>
#include <iostream>
#define N 100005
using namespace std;
int n,p,k,nextt[N],to[N],val[N],cnt=1,head[N],dis[N];
bool vis[N];
struct node
{
int x,y;
bool operator<(node a)const
{
return y>a.y;
}
};
priority_queue<node>q;
inline void ins(int u,int v,int w)
{
nextt[++cnt]=head[u];
to[cnt]=v;
val[cnt]=w;
head[u]=cnt;
}
bool dijkstra(int x)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1]=0;
q.push((node){1,dis[1]});
for(;!q.empty();){
node tmp;
tmp=q.top();
q.pop();
if(vis[tmp.x]) continue;
vis[tmp.x]=1;
for(int i=head[tmp.x];i;i=nextt[i])
{
int v=to[i],upd;
if(val[i]>x) upd=dis[tmp.x]+1;
else upd=dis[tmp.x];
if(dis[v]>upd)
{
dis[v]=upd;
q.push((node){v,dis[v]});
}
}
}
return dis[n]<=k;
}
int l,r,mid;
int main()
{
freopen("phone.in","r",stdin);
freopen("phone.out","w",stdout);
cin>>n>>p>>k;
for(int i,x,y,z;i<=p;i++)
{
cin>>x>>y>>z;
ins(x,y,z);
ins(y,x,z);
r+=z;
}
r=999999999;
int ans=-1;
for(;l<=r;)
{
mid=(l+r)/2;
if(dijkstra(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}