結果
問題 | No.1078 I love Matrix Construction |
ユーザー |
|
提出日時 | 2020-06-13 18:51:36 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,947 ms / 2,000 ms |
コード長 | 2,833 bytes |
コンパイル時間 | 288 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 165,376 KB |
最終ジャッジ日時 | 2024-06-25 18:24:34 |
合計ジャッジ時間 | 17,371 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
import syssys.setrecursionlimit(10000000)MOD = 10 ** 9 + 7INF = 10 ** 15class StronglyConnectedComponents:def __init__(self,N):self.N = Nself.G = [[] for _ in range(self.N)]self.rG = [[] for _ in range(self.N)]self.group = [1] * self.Nself.order = []def add_edge(self,u,v): # u -> vself.G[u].append(v)self.rG[v].append(u)def build(self):stack = []for s in range(self.N):if self.group[s] > 0:stack.append(s + 1)while stack:v = stack.pop()if v < 0:self.order.append(- v - 1)else:if self.group[v - 1] > 0:stack.append(-v)self.group[v - 1] = -1for e in self.G[v - 1]:stack.append(e + 1)cnt = 0for s in self.order[::-1]:if self.group[s] < 0:stack.append(s)self.group[s] = cntwhile stack:v = stack.pop()for e in self.rG[v]:if self.group[e] < 0:self.group[e] = cntstack.append(e)cnt += 1def __getitem__(self,i):if 0 <= i < self.N:return self.group[i]else:raise ValueError("StrongglyConnectedComponents index out of range")def main():N = int(input())S = list(map(int,input().split()))T = list(map(int,input().split()))U = list(map(int,input().split()))M = N*Nscc = StronglyConnectedComponents(2*M)for s,t,u in zip(S,T,U):s -= 1t -= 1if u == 0:for i in range(N):scc.add_edge(N*s + i,N*i + t + M)scc.add_edge(N*i + t,N*s + i + M)elif u == 1:for i in range(N):scc.add_edge(N*s + i + M,N*i + t + M)scc.add_edge(N*i + t,N*s + i)elif u == 2:for i in range(N):scc.add_edge(N*s + i,N*i + t)scc.add_edge(N*i + t + M,N*s + i + M)else:for i in range(N):scc.add_edge(N*s + i + M,N*i + t)scc.add_edge(N*i + t + M,N*s + i)scc.build()ans = [[0]*N for _ in range(N)]for i in range(N):for j in range(N):a = scc[N*i + j]b = scc[N*i + j + M]if a == b:print(-1)returnelif a < b:ans[i][j] = 1for a in ans:print(*a)if __name__ == '__main__':main()