P1396 营救

链接:Miku

------------------------

一道很贴切的题目

------------------------

这道题可以用各种修改后的图论算法等,不过单单是二分答案也是可以解决的。

检查一下对于每一个最大值,不走所有比此值大的路,看一下能不能走到终点即可

---------------------------

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,s,t;
int he[100001];
int p;
int vis[100001];
struct b{
    int v;
    int ne;
    int to;
}e[200001];
int x,y,z;
void add(int f,int t,int v){
    p++;
    e[p].v=v;
    e[p].to=t;
    e[p].ne=he[f];
    he[f]=p;
}
void dfs(int now,int k){
    if(vis[now])
    return ;
    vis[now]=1;
    for(int i=he[now];i;i=e[i].ne){
        if(e[i].v<=k)
            dfs(e[i].to,k);
    }
}
bool check(int k){
    memset(vis,0,sizeof(vis));
    dfs(s,k);
    if(vis[t])
    return 1;
    else
    return 0;
}
int main(){
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    int l=1,r=1000000;
    while(l<=r){
        int mid=l+(r-l)/2;
        if(check(mid)) r=mid-1;
        else
        l=mid+1;
    }
    cout<<l;
    return 0;
}
Ac
posted @ 2020-01-17 12:32  Simex  阅读(147)  评论(0编辑  收藏  举报