0541 - Lant 1
Cerinţa[edit | edit source]
Se dă lista muchiilor unui graf neorientat și trei vârfuri p q r . Să se determine un lanț cu extremitățile p q care conține vârful r.
Date de intrare[edit | edit source]
Fişierul de intrare lant1in.txt conţine pe prima linie numerele n p q r, reprezentând numărul de vârfuri ale grafului și cele trei vârfuri date. Fiecare dintre următoarele linii conține câte o pereche de numere i j, cu semnificația că există muchie între i și j.
Date de ieșire[edit | edit source]
Fişierul de ieşire lant1out.txt va conţine pe prima linie numărul de vârfuri din lanțul determinat. A doua linie va conține vârfurile din acest lanț, separate prin exact un spațiu.
Restricţii şi precizări[edit | edit source]
- 1 ⩽ n ⩽ 100
- 1 ⩽ i , j ⩽ n
- în fișierul de intrare muchiile se pot repeta;
- orice lanț cu extremitățile p q care conține vârful r și are lungimea mai mică decât 2*n este acceptat; lanțul nu trebuie să fie elementar
- pentru toate datele de test există cel puțin un lanț care respectă cerința;
Exemplul 1[edit | edit source]
- lant1in.txt
8 5 7 3 1 2 1 3 1 5 2 3 2 5 2 7 3 6 4 6 4 7 5 7 6 8 7 8
- lant1out.txt
Datele de intrare corespund restrictiilor impuse 5 5 1 3 2 7
Exemplu 2[edit | edit source]
- lant1in.txt
5 1 2 3 1 2 2 3 3 4 4 5 5 1 1 1000001
- lant1out.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> from collections import defaultdict
def bfs(graf, start):
vizitat = [False] * (len(graf) + 1) coada = [start] vizitat[start] = True parinte = [-1] * (len(graf) + 1)
while coada: nod = coada.pop(0) for vecin in graf[nod]: if not vizitat[vecin]: coada.append(vecin) vizitat[vecin] = True parinte[vecin] = nod
return parinte
def construieste_lant(parinte, start, end):
lant = [] nod = end while nod != start: lant.append(nod) nod = parinte[nod] lant.append(start) return lant[::-1]
def main():
with open('lant1in.txt', 'r') as f: n, p, q, r = map(int, f.readline().split()) graf = defaultdict(list) muchii = [] for _ in range(n-1): x, y = map(int, f.readline().split()) muchii.append((x, y)) graf[x-1].append(y-1) graf[y-1].append(x-1)
m = len(muchii) if 1 <= n <= 100000 and 0 <= m <= n*(n-1)//2: print("Datele de intrare corespund restrictiilor impuse") parinte = bfs(graf, p-1) lant = construieste_lant(parinte, p-1, r-1) parinte = bfs(graf, r-1) lant += construieste_lant(parinte, r-1, q-1)[1:] with open('lant1out.txt', 'w') as f: f.write(str(len(lant)) + "\n") f.write(' '.join(map(str, [i+1 for i in lant])) + "\n") else: print("Datele de intrare nu corespund restrictiilor impuse")
if __name__ == "__main__":
main()
</syntaxhighlight>