Pagini recente » Rating Olivia Davidescu (OliviaDavidescu) | Cod sursa (job #2804362) | Cod sursa (job #219187) | Cod sursa (job #948605) | Cod sursa (job #2529122)
#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;
}