結果
| 問題 |
No.812 Change of Class
|
| コンテスト | |
| ユーザー |
双六
|
| 提出日時 | 2019-04-12 23:08:45 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,859 bytes |
| コンパイル時間 | 130 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 97,036 KB |
| 最終ジャッジ日時 | 2024-06-12 19:56:47 |
| 合計ジャッジ時間 | 22,549 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | WA * 5 TLE * 1 -- * 54 |
ソースコード
from collections import defaultdict
from heapq import heappop, heappush
def getlist():
return list(map(int, input().split()))
class UnionFind:
def __init__(self, n):
self.par = [i for i in range(n + 1)]
self.rank = [0] * (n + 1)
self.size = [1] * (n + 1)
def find(self, x):
if self.par[x] == x:
return x
else:
self.par[x] = self.find(self.par[x])
return self.par[x]
def same_check(self, x, y):
return self.find(x) == self.find(y)
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if self.rank[x] < self.rank[y]:
if self.same_check(x, y) != True:
self.size[y] += self.size[x]
self.size[x] = 0
self.par[x] = y
else:
if self.same_check(x, y) != True:
self.size[x] += self.size[y]
self.size[y] = 0
self.par[y] = x
if self.rank[x] == self.rank[y]:
self.rank[x] += 1
def siz(self, x):
x = self.find(x)
return self.size[x]
class Graph(object):
def __init__(self):
self.graph = defaultdict(list)
def __len__(self):
return len(self.graph)
def add_edge(self, a, b):
self.graph[a].append(b)
def get_nodes(self):
return self.graph.keys()
class breadth(object):
def __init__(self, graph, s, n):
self.g = graph.graph
self.dist = defaultdict(lambda: float('inf'))
self.dist[s] = 0
self.visit = ["no" for i in range(n + 1)]
self.visit[s] = "yes"
self.prev = defaultdict(lambda: None)
self.Q = []
heappush(self.Q, (self.dist[s], s))
while self.Q:
dist_u, u = heappop(self.Q)
for v in self.g[u]:
if self.visit[v] == "yes":
continue
else:
self.dist[v] = dist_u + 1
self.prev[v] = u
self.visit[v] = "yes"
heappush(self.Q, (self.dist[v], v))
def s_d(self, goal):
return self.dist[goal]
def s_p(self, goal):
path = []
node = goal
while node is not None:
path.append(node)
node = self.prev[node]
return path[::-1]
N, M = getlist()
uf = UnionFind(N)
g_a = Graph()
for i in range(M):
p, q = list(map(int, input().split()))
uf.union(p, q)
g_a.add_edge(p, q)
g_a.add_edge(q, p)
Q = int(input())
for i in range(Q):
A = int(input())
E = breadth(g_a, A, N)
x = -1
for i in E.dist:
if uf.same_check(A, i) == True:
if E.dist[i] > x:
x = E.dist[i]
if x == 1:
print(uf.siz(A) - 1, 0)
else:
print(uf.siz(A) - 1, int((x + 1) // 2))
双六