比赛 |
不准粘代码,必须自己写(HS除外) |
评测结果 |
AAAAAAAAAA |
题目名称 |
电话网络 |
最终得分 |
100 |
用户昵称 |
梦那边的美好ET |
运行时间 |
0.154 s |
代码语言 |
C++ |
内存使用 |
13.71 MiB |
提交时间 |
2019-09-29 22:27:29 |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
vector<int>b[1010],c[1010];
int n,m,k,a1,a2,a3,l=0,r=0,ans,dis[1010];
bool bk[1010];
int ju(int p){
priority_queue<pair <int,int> >q;
for(int i=1;i<=n;i++)dis[i]=999999,bk[i]=0;
dis[1]=0;q.push(make_pair(0,1));
while(q.size()){
a1=q.top().second;q.pop();
if(bk[a1])continue;if(a1==n)break;bk[a1]=1;
for(int i=0;i<b[a1].size();i++){
a2=b[a1][i];a3=(c[a1][i]<=p)?0:1;
if(dis[a2]>dis[a1]+a3){
dis[a2]=dis[a1]+a3;
q.push(make_pair(-dis[a2],a2));
}
}
}
return (dis[n]<=k)?1:0;
}
void dfs(int p){
bk[p]=1;
if(b[p].size())
for(int i=0;i<b[p].size();i++)
if(!bk[b[p][i]])
dfs(b[p][i]);
return;
}
int main(){
freopen("phone.in","r",stdin);
freopen("phone.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a1,&a2,&a3);r=max(r,a3);
b[a1].push_back(a2);c[a1].push_back(a3);
b[a2].push_back(a1);c[a2].push_back(a3);
}
dfs(1);
if(!bk[n]){printf("-1");return 0;}
while(l<=r){
int mid=(l+r)>>1;
if(ju(mid))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d",ans);
return 0;
}