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