結果
問題 | No.1207 グラフX |
ユーザー | persimmon-persimmon |
提出日時 | 2021-06-17 10:46:36 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,124 ms / 2,000 ms |
コード長 | 2,802 bytes |
コンパイル時間 | 526 ms |
コンパイル使用メモリ | 81,928 KB |
実行使用メモリ | 201,332 KB |
最終ジャッジ日時 | 2024-06-10 18:27:40 |
合計ジャッジ時間 | 43,468 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,005 ms
201,332 KB |
testcase_01 | AC | 980 ms
195,828 KB |
testcase_02 | AC | 1,065 ms
196,452 KB |
testcase_03 | AC | 1,078 ms
195,752 KB |
testcase_04 | AC | 997 ms
200,328 KB |
testcase_05 | AC | 1,101 ms
173,864 KB |
testcase_06 | AC | 1,100 ms
173,488 KB |
testcase_07 | AC | 1,124 ms
173,900 KB |
testcase_08 | AC | 840 ms
152,812 KB |
testcase_09 | AC | 927 ms
174,088 KB |
testcase_10 | AC | 1,086 ms
170,352 KB |
testcase_11 | AC | 1,090 ms
173,892 KB |
testcase_12 | AC | 828 ms
153,876 KB |
testcase_13 | AC | 461 ms
105,952 KB |
testcase_14 | AC | 1,021 ms
185,512 KB |
testcase_15 | AC | 894 ms
165,268 KB |
testcase_16 | AC | 472 ms
108,608 KB |
testcase_17 | AC | 717 ms
144,396 KB |
testcase_18 | AC | 625 ms
138,208 KB |
testcase_19 | AC | 639 ms
124,012 KB |
testcase_20 | AC | 1,016 ms
198,460 KB |
testcase_21 | AC | 139 ms
81,216 KB |
testcase_22 | AC | 716 ms
141,072 KB |
testcase_23 | AC | 787 ms
154,020 KB |
testcase_24 | AC | 564 ms
135,224 KB |
testcase_25 | AC | 1,025 ms
197,632 KB |
testcase_26 | AC | 838 ms
157,876 KB |
testcase_27 | AC | 981 ms
182,956 KB |
testcase_28 | AC | 921 ms
169,796 KB |
testcase_29 | AC | 949 ms
182,516 KB |
testcase_30 | AC | 528 ms
117,560 KB |
testcase_31 | AC | 394 ms
100,224 KB |
testcase_32 | AC | 484 ms
118,392 KB |
testcase_33 | AC | 499 ms
116,808 KB |
testcase_34 | AC | 888 ms
160,632 KB |
testcase_35 | AC | 159 ms
81,540 KB |
testcase_36 | AC | 896 ms
171,000 KB |
testcase_37 | AC | 781 ms
147,592 KB |
testcase_38 | AC | 300 ms
94,096 KB |
testcase_39 | AC | 533 ms
121,088 KB |
testcase_40 | AC | 290 ms
93,496 KB |
testcase_41 | AC | 638 ms
125,240 KB |
testcase_42 | AC | 37 ms
53,484 KB |
testcase_43 | AC | 35 ms
53,072 KB |
testcase_44 | AC | 37 ms
53,128 KB |
testcase_45 | AC | 954 ms
192,344 KB |
testcase_46 | AC | 941 ms
192,112 KB |
testcase_47 | AC | 950 ms
192,236 KB |
testcase_48 | AC | 935 ms
192,576 KB |
ソースコード
""" zi!=zjなので、パスの最短距離はそこに含まれるzの最大値で決まる。 パスに含まれる辺の本数がどれだけ大きくてもzの最大値が他のパスより小さければそのパスが最短になる。 ziの小さい順にグラフに辺を追加していく。unionFind 木ができる。あとはやるだけ。 """ def main0(n,m,x,uvz): mod=10**9+7 from heapq import heappop,heappush g=[[] for _ in range(n)] for u,v,z in uvz: u,v=u-1,v-1 g[u].append([v,pow(x,z)]) g[v].append([u,pow(x,z)]) ans=0 inf=float('inf') for i in range(n-1): seen=[inf]*n todo=[[0,i]] seen[i]=0 while todo: c,v=heappop(todo) if seen[v]<c:continue for nv,nc in g[v]: if seen[nv]>seen[v]+nc: seen[nv]=seen[v]+nc heappush(todo,[seen[nv],nv]) ans+=sum(seen[i+1:]) ans%=mod return ans # UnionFind class UnionFind: def __init__(self,n): self.n=n self.par=[-1]*n # par[i]:i根ならグループiの要素数に-1をかけたもの。i根じゃないならiの親 self.rank=[0]*n # iの根を返す def find(self,i): if self.par[i]<0:return i ii=i while self.par[i]>=0: i=self.par[i] while i!=self.par[ii]: ii,self.par[ii]=self.par[ii],i return i # iとjをunionし、根頂点を返す def union(self,i,j): i,j=self.find(i),self.find(j) if i==j:return i elif self.rank[i]>self.rank[j]: # par[i]:グループiの要素数で判断してもいい self.par[i]+=self.par[j] self.par[j]=i else: self.par[j]+=self.par[i] self.par[i]=j # 深さ(rank)が同じものを併合した場合1を足す if self.rank[i]==self.rank[j]: self.rank[j]+=1 return self.find(i) # iとjが同じグループに属するか判断 def same(self,i,j): return self.find(i)==self.find(j) # ノードiが属する木のサイズを返す def size(self,i): return -self.par[self.find(i)] def main1(n,m,x,uvz): mod=10**9+7 uf=UnionFind(n) ans=0 ki=[[] for _ in range(n)] for u,v,z in uvz: u,v=u-1,v-1 if uf.same(u,v):continue uf.union(u,v) ki[v].append([u,pow(x,z,mod)]) ki[u].append([v,pow(x,z,mod)]) dfs_order=[] par=[None]*n todo=[[0,-1]] while todo: v,p=todo.pop() dfs_order.append(v) for nv,nc in ki[v]: if nv==p:continue todo.append([nv,v]) par[nv]=v,nc dfs_order.reverse() ans=0 dp=[1]*n for v in dfs_order[:-1]: p,c=par[v] ans+=c*dp[v]*(n-dp[v]) ans%=mod dp[p]+=dp[v] return ans if __name__=='__main__': n,m,x=map(int,input().split()) uvz=[list(map(int,input().split())) for _ in range(m)] #ret0=main0(n,m,x,uvz) ret1=main1(n,m,x,uvz) #print(ret0) print(ret1)