每日一题之 hiho 1139 二分答案

描述
在上一回和上上回里我们知道Nettle在玩《艦これ》,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了。
在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示
这里写图片描述
其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边)。
在游戏中要从一个战略点到相邻战略点需要满足一定的条件,即需要舰队的索敌值大于等于这两点之间航线的索敌值需求。
由于提高索敌值需要将攻击机、轰炸机换成侦察机,舰队索敌值越高,也就意味着舰队的战力越低。
另外在每一个战略点会发生一次战斗,需要消耗1/K的燃料和子弹。必须在燃料和子弹未用完的情况下进入boss点才能与boss进行战斗,所以舰队最多只能走过K条航路。
现在Nettle想要以最高的战力来进攻boss点,所以他希望能够找出一条从起始点(编号为1的点)到boss点的航路,使得舰队需要达到的索敌值最低,并且有剩余的燃料和子弹。

特别说明:两个战略点之间可能不止一条航线,两个相邻战略点之间可能不止一条航线。保证至少存在一条路径能在燃料子弹用完前到达boss点。

提示:你在找什么?

输入
第1行:4个整数N,M,K,T。N表示战略点数量,M表示航线数量,K表示最多能经过的航路,T表示boss点编号, 1≤N,K≤10,000, N≤M≤100,000
第2..M+1行:3个整数u,v,w,表示战略点u,v之间存在航路,w表示该航路需求的索敌值,1≤w≤1,000,000。

输出
第1行:一个整数,表示舰队需要的最小索敌值。

样例输入
5 6 2 5
1 2 3
1 3 2
1 4 4
2 5 2
3 5 5
4 5 3
样例输出
3

思路:

就二分mid 看能否满足条件。复习一下vector模拟邻接表与bfs遍历。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int maxn = 1e5+5;


struct Edge
{
    int to,w;
};

vector<Edge>edge[maxn];
int  vis[maxn];

int n,m,k,t;

bool judge(int x)
{
    memset(vis,0,sizeof(vis));
    queue<int>q;
    q.push(1);

    while(!q.empty()) {
        int cur = q.front();
        q.pop();
        if (cur == t && vis[cur] <= k) return true;
        for (int i = 0; i < edge[cur].size(); ++i) {
            int tmp = edge[cur][i].to;
            if (!vis[tmp] && edge[cur][i].w <= x) {
                vis[tmp] = vis[cur] + 1;
                q.push(tmp);
            }

        }
    }

    return false;
}


int Search(int low, int high)
{

    while(low < high) {
        int mid = (low + high) / 2;
        if (judge(mid)) high = mid;
        else
            low = mid + 1;
    }

    return low;
}

int main()
{
    cin >> n >> m >> k >> t;
    int u,v,w;
    Edge e;
    for (int i = 0; i < m; ++i) {
        cin >> u >> v >> w;
        e.to = v;
        e.w = w;
        edge[u].push_back(e);
        e.to = u;
        edge[v].push_back(e);
    }

    int res = Search(1,1e9);

    cout << res <<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014046022/article/details/80685416