Cod sursa(job #2529122)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 22 ianuarie 2020 23:02:28
Problema PScNv Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <bitset>
#include <stack>
#include <string>
#define pii pair <int, short>

using namespace std;

const int N = 250005, oo = 2e9;
int n, startnode, endnode, maxcost;
vector <pii> L[N];
bitset <N> seen;
stack <int> st;

void Read ()
{
    ifstream fin ("pscnv.in");
    int m, x, y;
    short cost;
    fin >> n >> m >> startnode >> endnode;
    string s;
    fin.get();
    for (int i = 1; i <= m; i++)
    {
        getline(fin, s);
        int currnumber = 0, j = 0;
        while (s[j] == ' ')
            j++;
        while ('0' <= s[j] && s[j] <= '9')
            currnumber = (currnumber * 10) + s[j++] - '0';
        x = currnumber;
        currnumber = 0;
        while (s[j] == ' ')
            j++;
        while ('0' <= s[j] && s[j] <= '9')
            currnumber = (currnumber * 10) + s[j++] - '0';
        y = currnumber;
        currnumber = 0;
        while (s[j] == ' ')
            j++;
        while ('0' <= s[j] && s[j] <= '9')
            currnumber = (currnumber * 10) + s[j++] - '0';
        cost = currnumber;
        L[x].push_back({y, cost});
        L[y].push_back({x, cost});
        if (cost > maxcost) maxcost = cost;
    }
}

bool OK;

bool DFS (int node, short cost)
{
    seen[node] = 1;
    for (auto next : L[node])
        if (!seen[next.first] && next.second <= cost)
        {
            if (next.first == endnode)
                OK = true;
            else
                DFS(next.first, cost);
        }
    return OK;
}

bool IsValidPath (short k)
{
    seen.reset();
    OK = false;
    return (DFS(startnode, k));
}

short BinSearch ()
{
    short left, right, mid, ans;
    left = 1;
    right = maxcost;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (IsValidPath(mid))
        {
            ans = mid;
            right = mid - 1;
        }
        else left = mid + 1;
    }
    return ans;
}

void Solve ()
{

    ofstream fout ("pscnv.out");
    fout << BinSearch() << "\n";
    fout.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}