【递归练习题】地震


题目描述

一座地震频发的山上有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

{∞}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值