結果
問題 | No.2536 同値性と充足可能性 |
ユーザー |
![]() |
提出日時 | 2023-11-12 00:13:52 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 929 ms / 2,000 ms |
コード長 | 2,203 bytes |
コンパイル時間 | 130 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 56,356 KB |
最終ジャッジ日時 | 2024-09-26 02:57:04 |
合計ジャッジ時間 | 8,185 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
import sysinput = sys.stdin.readlineN,M=map(int,input().split())E=[[] for i in range(N+1)]E2=[[] for i in range(N+1)]for i in range(M):S=input().split()x=int(S[0])y=int(S[-1])if len(S[1])==4:E[x].append(y)E[y].append(x)else:E2[x].append(y)E2[y].append(x)# UnionFindGroup = [i for i in range(N+1)] # グループ分けNodes = [1]*(N+1) # 各グループのノードの数def find(x):while Group[x] != x:x=Group[x]return xdef Union(x,y):if find(x) != find(y):if Nodes[find(x)] < Nodes[find(y)]:Nodes[find(y)] += Nodes[find(x)]Nodes[find(x)] = 0Group[find(x)] = find(y)else:Nodes[find(x)] += Nodes[find(y)]Nodes[find(y)] = 0Group[find(y)] = find(x)for i in range(N+1):for to in E[i]:Union(i,to)E3=[[] for i in range(N+1)]for i in range(N+1):for to in E2[i]:if find(i)==find(to):print("No")exit()else:E3[find(i)].append(find(to))E3[find(to)].append(find(i))ANS=[]USE=[-1]*(N+1)for i in range(N+1):if find(i)!=i:continueif USE[i]!=-1:continueQ=[i]USE[i]=0zero=Nodes[i]one=0Z=[i]O=[]while Q:#print(Q)x=Q.pop()for to in E3[x]:if USE[to]==-1:USE[to]=USE[x]^1if USE[to]==0:zero+=Nodes[to]Z.append(to)else:one+=Nodes[to]O.append(to)Q.append(to)else:if USE[to]==USE[x]^1:passelse:print("No")exit()#print(Z,O)if zero>=one:for z in Z:ANS.append(z)else:for o in O:ANS.append(o)SET=set(ANS)LANS=[]for i in range(1,N+1):if find(i) in SET:LANS.append(i)print("Yes")print(len(LANS))print(*LANS)