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
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Anarhie:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("anarhie.in");
ofstream fout("anarhie.out");
int n , m , K , p, q , a[105][105],
x[105], // backtracking
z[105], // vector caracteristic, pentru sindicatele din submultimea curenta
v[105], // vizitati pentru parcurgere
rasp = 1000
;
/*
* Generez toate submultimile de sindicate, si pentru fiecare submultime verific
* daca poate fi parcurs traseul folosind doar sindicatele din acea submultime
* O( 2^k * n^2)
* */
void citire()
{
fin >> n >> m >> K;
fin >> p >> q;
int i , j , s;
for(int k = 1 ; k <= m ; ++k)
{
fin >> i >> j >> s;
a[i][j] = s;
}
}
int DF(int x)
{
if(x == q)
return 1;
v[x] = 1;
int rez = 0;
for(int i = 1 ; i <= n ; ++i)
if(v[i] == 0 && z[a[x][i]] == 1)
rez |= DF(i);
return rez;
}
int verif(int k)
{
for(int i = 1 ; i <= n ; ++i)
v[i] = z[i] = 0;
for(int i = 1 ; i <= k ; ++i)
z[x[i]] = 1;
int pot = DF(p);
return pot;
}
void back(int k)
{
for(int i = x[k-1] + 1 ; i <= K ; i ++)
{
x[k] = i;
if(verif(k))
{
if(rasp > k)
rasp = k;
}
back(k+1);
}
}
int main()
{
citire();
back(1);
fout << rasp;
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #595 Anarhie
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #595 Anarhie de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!