比赛 |
不准粘代码,必须自己写(HS除外) |
评测结果 |
AAAAAAAAAA |
题目名称 |
电话网络 |
最终得分 |
100 |
用户昵称 |
瑆の時間~無盡輪迴·林蔭 |
运行时间 |
0.105 s |
代码语言 |
C++ |
内存使用 |
17.59 MiB |
提交时间 |
2019-10-09 00:46:38 |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
int i,j,x,y,n,m,k,bh,low,high,mid,ans;
int l[1010][1010];
bool v[1010];
int d[1010],z[2010];
vector<int> b[1010];
int max(int a,int b){return(a>b)?a:b;}
void spfa(int cs){
int i,t=0,w=0,p=0,cd=0;
memset(v,0,sizeof(v));
memset(d,0x3f3f3f3f,sizeof(d));
d[1]=0;
t++; v[1]=true; z[1]=1;
while (t!=w) {
w=(w+1)%n;
p=z[w]; v[p]=false;
if (b[p].size()!=0)
for (i=0;i<=b[p].size()-1;i++)
{
cd=0;
if (l[p][b[p][i]]>cs) cd=1;
if (d[p]+cd<d[b[p][i]]) {
d[b[p][i]]=d[p]+cd;
if (!v[b[p][i]]) {
t++; t=t%n;
z[t]=b[p][i];
v[b[p][i]]=true;
}
}
}
}
bh=0;
if (d[n]<=k) bh=1;
return;
}
int main(){
freopen("phone.in","r",stdin);
freopen("phone.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
scanf("%d",&l[x][y]);
high=max(high,l[x][y]);
b[x].push_back(y);
b[y].push_back(x);
l[y][x]=l[x][y];
}
low=0;
ans=0x3f3f3f3f;
while (low<=high) {
mid=(low+high)/2;
spfa(mid);
if (bh==1) {
high=mid-1;
ans=min(ans,mid);
} else low=mid+1;
}
if (ans!=0x3f3f3f3f)
printf("%d\n",ans); else printf("-1\n");
return 0;
}