比赛 |
不准粘代码,必须自己写(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;
- }