結果

問題 No.1502 Many Simple Additions
ユーザー とりゐ
提出日時 2021-04-17 02:49:43
言語 PyPy3
(7.3.15)
結果
WA  
(最新)
AC  
(最初)
実行時間 -
コード長 3,057 bytes
コンパイル時間 341 ms
コンパイル使用メモリ 82,336 KB
実行使用メモリ 139,272 KB
最終ジャッジ日時 2024-09-14 23:54:12
合計ジャッジ時間 8,719 ms
ジャッジサーバーID
(参考情報)
judge6 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 WA * 4
other AC * 14 WA * 19 RE * 6
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

from collections import defaultdict
from collections import deque
class UnionFind():
def __init__(self, n):
self.n = n
self.parents = [-1] * n
def find(self, x):
if self.parents[x] < 0:
return x
else:
self.parents[x] = self.find(self.parents[x])
return self.parents[x]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return
if self.parents[x] > self.parents[y]:
x, y = y, x
self.parents[x] += self.parents[y]
self.parents[y] = x
def size(self, x):
return -self.parents[self.find(x)]
def same(self, x, y):
return self.find(x) == self.find(y)
def members(self, x):
root = self.find(x)
return [i for i in range(self.n) if self.find(i) == root]
def roots(self):
return [i for i, x in enumerate(self.parents) if x < 0]
def group_count(self):
return len(self.roots())
def all_group_members(self):
group_members = defaultdict(list)
for member in range(self.n):
group_members[self.find(member)].append(member)
return group_members
mod=10**9+7
INF=10**100
n,m,k=map(int,input().split())
edge=[[] for i in range(n)]
uf=UnionFind(n)
for i in range(m):
a,b,c=map(int,input().split())
edge[a-1].append([b-1,c])
edge[b-1].append([a-1,c])
uf.union(a-1,b-1)
def f(G):
d={}
for i in range(len(G)):
d[G[i]]=i
q=deque()
q.append([0,0])
seen=[[INF,INF] for i in range(len(G))]
seen[0][0]=0
while q:
x=q.pop()
for v in edge[G[x[0]]]:
V=d[v[0]]
W=v[1]
if seen[V][(x[1]+1)%2]==INF:
if x[1]==0:
seen[V][1]=W-seen[x[0]][0]
else:
seen[V][0]=W-seen[x[0]][1]
if seen[V][0]!=INF and seen[V][1]!=INF:
if (seen[V][0]+seen[V][1])%2==1:
return 0
else:
return bfs((seen[V][1]-seen[V][0])//2,G)
else:
q.append([V,(x[1]+1)%2])
else:
if x[1]==0:
if seen[x[0]][0]+seen[V][1]!=W:
return 0
else:
if seen[x[0]][1]+seen[V][0]!=W:
return 0
min0=INF
min1=INF
max0=-INF
max1=-INF
for i in range(len(G)):
if seen[i][0]!=INF:
min0=min(min0,seen[i][0])
max0=max(max0,seen[i][0])
if seen[i][1]!=INF:
min1=min(min1,seen[i][1])
max1=max(max1,seen[i][1])
return max(min(k-max0,min1-1)-max(1-min0,max1-k,0)+1,0)
def bfs(a,g):
seen2=[INF]*len(g)
seen2[0]=a
d2={}
for i in range(len(g)):
d2[g[i]]=i
q2=deque()
q2.append(0)
flag=True
while q2:
y=q2.pop()
for vertex2 in edge[y]:
V2=d2[vertex2[0]]
W2=vertex2[1]
if seen2[V2]==INF:
seen2[V2]=W2-seen2[y]
q2.append(V2)
else:
if seen2[V2]!=W2-seen2[y]:
flag=False
if flag and min(seen2)>0:
return 1
else:
return 0
ans=1
for i in list(uf.all_group_members().values()):
ans*=f(i)
ans=ans%mod
print(ans)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0