#include // Ošklivý, ale praktický trik (funguje jen v GCC) using namespace std; #define inf 1023456789 struct graf { int vrcholu; // soused[i] je seznam vrcholů, do nichž se dá dostat z i-tého vrcholu po jedné // hraně; delka[i] udává délky těchto hran ve stejném pořadí. vector > soused; vector > delka; graf(int v = 0) { vrcholu = v; soused.resize(vrcholu); delka.resize(vrcholu); } void pridej_hranu(int u, int v, int d) { soused[u].push_back(v); delka[u].push_back(d); } int nejkratsi_cesta(int start, int cil) { // Dijkstrův algoritmus vector vzdalenost(vrcholu, inf); vzdalenost[start] = 0; priority_queue, vector >, greater > > halda; halda.push(pair (0, start)); while (!halda.empty()) { pair t = halda.top(); halda.pop(); if (t.first > vzdalenost[t.second]) continue; int ja = t.second; for (int i=0; i vzdalenost[ja] + delka[ja][i]) { vzdalenost[on] = vzdalenost[ja] + delka[ja][i]; halda.push(pair (vzdalenost[on], on)); } } } if (vzdalenost[cil] == inf) return 0; return vzdalenost[cil]; } }; int main() { int n, m, a, b, k; scanf("%d %d %d %d %d",&n,&m,&a,&b,&k); vector x(m+2), y(m+2), s(m+2); vector > vchazi_ulice(n), vychazi_ulice(n); for(int i=0; i > vstupni_podle_sirky; for (int j=0; j (s[vchazi_ulice[i][j]], vchazi_ulice[i][j])); // zarážka pro binární vyhledávání: vstupni_podle_sirky.push_back(pair (0, -1)); sort(vstupni_podle_sirky.begin(), vstupni_podle_sirky.end()); for (int j=0; j 1) { int stredne = (malo+hodne)/2; if (vstupni_podle_sirky[stredne].first - k <= s[v]) malo = stredne; else hodne = stredne; } int u = vstupni_podle_sirky[malo].second; if (u != -1) nas_graf.pridej_hranu(u, v, 1); } for(int j=1; j