fbpx

Problema #595 – Anarhie – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

În imperiul maleficului Costel s-a instaurat anarhia. În imperiu sunt n orașe, numerotate de la 1 la n, unite prin m șosele unidirecționale, fiecare șosea fiind controlată de o bandă afiliată la unul dintre cele k sindicate banditești existente în imperiu, numerotate de la 1 la k. Pentru a călători prin pe șoselele din imperiu, orice călător trebuie să plătească taxe sindicatelor: plata taxei către un anumit sindicat îi permite călătorului să folosească nelimitat orice șosea controlată de o bandă afiliată acelui sindicat. Pentru toate sindicatele se plătește aceeași taxă.

Călătorul Gigel trebuie să ajungă din orașul p în orașul q. Determinați numărul minim de sindicate banditești cărora Gigel trebuie să le plătească taxe, pentru a putea realiza călătoria dorită.

Date de intrare

Fișierul de intrare anarhie.in conține pe prima linie numerele n m k. A doua linie conține numerele p q. Fiecare dintre următoarele m linii conține un triplet i j s, cu semnificația: între orașul i și orașul j există o șosea unidirecțională controlată de o bandă afiliată sindicatului s.

Date de ieșire

Fișierul de ieșire anarhie.out va conține pe prima linie numărul Z, reprezentând numărul minim de sindicate cărora trebuie plătită taxă pentru călătoria din orașul p în orașul q.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • 1 ≤ m ≤ n*(n-1)
  • 1 ≤ k ≤ 10
  • 1 ≤ p, q ≤ n, p ≠ q
  • 1 ≤ i ≤ n, 1 ≤ j ≤ n, 1 ≤ s ≤ k, i ≠ j

Exemplu

anarhie.in

6 10 3
1 5
1 2 3
1 3 2
2 4 3
2 5 2
3 4 1
4 5 3
4 6 2
5 1 2
5 6 2
6 5 1

anarhie.out

1

Explicație

Gigel va călătoria pe traseul 1 2 4 5, plătind taxă sindicatului 3.

#include <bits/stdc++.h>

using namespace std;

ifstream cin("anarhie.in");
ofstream cout("anarhie.out");

int n , m , p , q , x , y , r , k , X[12] , P[101] , S[101] , A[101][101] , mini = 999999999 , s;

int dfs(int c)
{
    P[c] = 1;
    for(int i = 1 ; i <= n ; i++)
        if(!P[i] && S[A[c][i]] && A[c][i])
            dfs(i);
}

int verif(int k)
{
    for(int i = 1 ; i <= n ; i++)
        S[i] = P[i] = 0;

    for(int i = 1 ; i <= k ; i++)
        S[X[i]] = 1;

    dfs(p);
    return P[q];
}

void back(int k)
{
    for(int i = X[k - 1] + 1 ; i <= s ; i++)
    {
        X[k] = i;
        if(verif(k))
            if(k < mini) mini = k;
        back(k + 1);
    }
}

int main()
{
    cin >> n >> m >> s;
    cin >> p >> q;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x >> y >> r;
        A[x][y] = r;
    }
    back(1);
    cout << mini;
}
Comentarii

S-ar putea sa iti placa