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