比赛 不准粘代码,必须自己写(HS除外) 评测结果 AAAAAAAAAA
题目名称 电话网络 最终得分 100
用户昵称 梦那边的美好ET 运行时间 0.154 s
代码语言 C++ 内存使用 13.71 MiB
提交时间 2019-09-29 22:27:29
显示代码纯文本
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<vector>
  7. #include<queue>
  8. using namespace std;
  9. vector<int>b[1010],c[1010];
  10. int n,m,k,a1,a2,a3,l=0,r=0,ans,dis[1010];
  11. bool bk[1010];
  12. int ju(int p){
  13. priority_queue<pair <int,int> >q;
  14. for(int i=1;i<=n;i++)dis[i]=999999,bk[i]=0;
  15. dis[1]=0;q.push(make_pair(0,1));
  16. while(q.size()){
  17. a1=q.top().second;q.pop();
  18. if(bk[a1])continue;if(a1==n)break;bk[a1]=1;
  19. for(int i=0;i<b[a1].size();i++){
  20. a2=b[a1][i];a3=(c[a1][i]<=p)?0:1;
  21. if(dis[a2]>dis[a1]+a3){
  22. dis[a2]=dis[a1]+a3;
  23. q.push(make_pair(-dis[a2],a2));
  24. }
  25. }
  26. }
  27. return (dis[n]<=k)?1:0;
  28. }
  29. void dfs(int p){
  30. bk[p]=1;
  31. if(b[p].size())
  32. for(int i=0;i<b[p].size();i++)
  33. if(!bk[b[p][i]])
  34. dfs(b[p][i]);
  35. return;
  36. }
  37. int main(){
  38. freopen("phone.in","r",stdin);
  39. freopen("phone.out","w",stdout);
  40. scanf("%d%d%d",&n,&m,&k);
  41. for(int i=1;i<=m;i++){
  42. scanf("%d%d%d",&a1,&a2,&a3);r=max(r,a3);
  43. b[a1].push_back(a2);c[a1].push_back(a3);
  44. b[a2].push_back(a1);c[a2].push_back(a3);
  45. }
  46. dfs(1);
  47. if(!bk[n]){printf("-1");return 0;}
  48. while(l<=r){
  49. int mid=(l+r)>>1;
  50. if(ju(mid))ans=mid,r=mid-1;
  51. else l=mid+1;
  52. }
  53. printf("%d",ans);
  54. return 0;
  55. }