题目描述
一座地震频发的山上有N个村庄,编号分别为1至N。某些村庄之间有山路相连,每条山路都有一个防震等级。假如一条路的防震等级是k(k>0),就表示如果发生k级或者小于k级的地震,这条山路是安然无恙的,如果发生大于k级的地震,这条路就会被破坏,不能通过了。
现在邮递员小明要从村庄1出发去村庄N,他想知道最高发生几级地震的情况下,他仍然能顺利到达目的地。
输入
输入数据的第一行是用空格隔开的两个整数N和M,分别表示村庄数和山路数(2 <= N <= 50, 1 <= M <= 200)。接下来有M行,每行包括三个整数u,v,w,表示村庄u和村庄v之间有一条防震等级为w的路(1 <= u, v <= N, 1 <= w <= 20)。路是双向的,在没有被破坏的情况下,既可以从u到达v,也可以从v到达u。两个村庄之间最多有一条路。输入数据保证在没有发生地震的时候可以从村庄1到达村庄N。
输出
输出只有一行,包含一个整数,表示最高发生几级地震的情况下仍然能到达村庄N。
样例输入 Copy
4 5
1 2 3
1 3 5
2 4 10
3 4 6
1 4 1
样例输出 Copy
5
提示
【说明】 在发生5级地震的情况下,小明可以通过1->3->4这条路到达村庄4,但如果发生6级地震就不能到达了。
代码:
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <list>
#include <limits.h>
using namespace std;
int u[210],v[210],w[210],n,m;
int S;
bool vis[100010];
bool dfs(int x){
if(x==n)return 1;
for(int i=1;i<=m;i++){
if((u[i]==x&&w[i]>=S&&!vis[v[i]])){
vis[v[i]]=1;
if(dfs(v[i]))return 1;
}
else if((v[i]==x&&w[i]>=S&&!vis[u[i]])){
vis[u[i]]=1;
if(dfs(u[i]))return 1;
}
}return 0;
}
bool Check(int s){
memset(vis,0,sizeof(vis));
S=s;
vis[1]=1;
return dfs(1);
}
int main()
{
cin>>n>>m;
int l=0,r=-1;
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
r=max(r,w[i]);
}
r++;
while(l<r){
int mid=(l+r)/2;
if(Check(mid))l=mid+1;
else r=mid;
}
cout<<l-1;
return 0;
}