import sys
def floyd_warshall(n, dist):
for k in range(n):
for i in range(n):
for j in range(n):
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
return dist
def znajdz_min_bak(n, macierz):
INF = 10**9
# Tworzenie macierzy odległości
dist = [[INF] * n for _ in range(n)]
for i in range(n):
for j in range(n):
if i == j:
dist[i][j] = 0
elif macierz[i][j] == '1':
dist[i][j] = 1
# Obliczenie wszystkich najkrótszych ścieżek
dist = floyd_warshall(n, dist)
# Znalezienie najgorszego przypadku przed dodaniem teleportu
srednica_przed = max(max(wiersz) for wiersz in dist)
# Próba dodania teleportu i minimalizacja średnicy
min_bak = srednica_przed
for i in range(n):
for j in range(i + 1, n):
nowa_dist = [wiersz[:] for wiersz in dist]
for a in range(n):
for b in range(n):
nowa_dist[a][b] = min(nowa_dist[a][b], nowa_dist[a][i] + nowa_dist[j][b] + 1,
nowa_dist[a][j] + nowa_dist[i][b] + 1)
srednica_po = max(max(wiersz) for wiersz in nowa_dist)
min_bak = min(min_bak, srednica_po)
return min_bak
def main():
t = int(sys.stdin.readline())
wyniki = []
for _ in range(t):
n = int(sys.stdin.readline())
macierz = [sys.stdin.readline().strip() for _ in range(n)]
wyniki.append(str(znajdz_min_bak(n, macierz)))
print("\n".join(wyniki))
if __name__ == "__main__":
main()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import sys def floyd_warshall(n, dist): for k in range(n): for i in range(n): for j in range(n): dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) return dist def znajdz_min_bak(n, macierz): INF = 10**9 # Tworzenie macierzy odległości dist = [[INF] * n for _ in range(n)] for i in range(n): for j in range(n): if i == j: dist[i][j] = 0 elif macierz[i][j] == '1': dist[i][j] = 1 # Obliczenie wszystkich najkrótszych ścieżek dist = floyd_warshall(n, dist) # Znalezienie najgorszego przypadku przed dodaniem teleportu srednica_przed = max(max(wiersz) for wiersz in dist) # Próba dodania teleportu i minimalizacja średnicy min_bak = srednica_przed for i in range(n): for j in range(i + 1, n): nowa_dist = [wiersz[:] for wiersz in dist] for a in range(n): for b in range(n): nowa_dist[a][b] = min(nowa_dist[a][b], nowa_dist[a][i] + nowa_dist[j][b] + 1, nowa_dist[a][j] + nowa_dist[i][b] + 1) srednica_po = max(max(wiersz) for wiersz in nowa_dist) min_bak = min(min_bak, srednica_po) return min_bak def main(): t = int(sys.stdin.readline()) wyniki = [] for _ in range(t): n = int(sys.stdin.readline()) macierz = [sys.stdin.readline().strip() for _ in range(n)] wyniki.append(str(znajdz_min_bak(n, macierz))) print("\n".join(wyniki)) if __name__ == "__main__": main() |
English