#include #include #include using namespace std; /* * Formát vstupu (program čte ze standardního vstupu): * 1. řádek: N M * 2. řádek: start cil - čísla startovního a cílového vrcholu * následuje M řádků s čísly i a j značící hranu mezi vrcholy i a j */ int main(int argc, char** argv) { int N, M, start, cil, a, b; scanf("%d%d", &N, &M); scanf("%d%d", &start, &cil); vector hrany[N]; queue fronta; int delka[N]; // Pole obsahující délku nejkratší cesty do vrcholu int pocet[N]; // Pole obsahující počet nejkratších cest do vrcholu for (int i = 0; i < N; ++i) { delka[i] = -1; pocet[i] = 0; } // Načítání vstupu for (int i = 0; i < M; ++i) { scanf("%d%d", &a, &b); hrany[a].push_back(b); } // Inicializace pro startovní vrchol fronta.push(start); delka[start] = 0; pocet[start] = 1; int vychozi; int koncovy; // Procházíme frontu while (!fronta.empty()) { vychozi = fronta.front(); fronta.pop(); // Procházíme jednotlivé hrany zkoumaného (výchozího) vrcholu for (int i = 0; i < hrany[vychozi].size(); ++i) { koncovy = hrany[vychozi][i]; if (delka[koncovy] == -1) { // Koncový vrchol jsme dosud neviděli delka[koncovy] = delka[vychozi] + 1; pocet[koncovy] = pocet[vychozi]; fronta.push(koncovy); } else if (delka[koncovy] == delka[vychozi] + 1) { // Koncový vrchol jsme viděli a našli další nejkratší cestu pocet[koncovy] += pocet[vychozi]; } // Jinak neděláme nic } } printf("%d\n", pocet[koncovy]); return 0; }