ほぼ日刊競プロ ABC272 B - Everyone is Friends
問題文
1,2,…,N の番号がついた N 人の人がいます。
M 回の舞踏会が行われました。 i (1≤i≤M) 回目の舞踏会には k
i人が参加し、参加した人は人 x
i,1,xi,2,…,xi,kiでした。どの二人も少なくとも 1 回同じ舞踏会に参加したか判定してください。
考えたこと
実は時間内に考えつかなかった.解説には二重配列を使って更新する等が書いてあったが...
あとでゆっくり考えてみたところ集合で考えればわかりやすいのでは?と考えた.(pythonなのでsetを用いて集合を扱う)
itertoolsを使い,コンビネーションで集合を全て列挙する.
その後出てきた集合を全ての集合から引いていく.元の集合が空集合になれば正解であると考えた.
(出てきた集合を和集合として作り,元々の集合数とイコールになれば良いとも考えた,こっちでもできた)
N,M = map(int,input().split())
K = []
X = []
import itertools
ans = set(list(itertools.combinations(range(1,N+1),2)))
#print (ans)
for i in range(M):
Klist = list(map(int,input().split()))
K.append(Klist[0])
X.append(Klist[1:])
ans1 = set()
for i in range(len(X)):
ans1 = set(list(itertools.combinations(X[i],2)))
ans = ans-ans1
if len(ans)>0:
print ("No")
else:
print ("Yes")
######以下でもAC########
N,M = map(int,input().split())
K = []
X = []
import itertools
ans = set(list(itertools.combinations(range(1,N+1),2)))
#print (ans)
for i in range(M):
Klist = list(map(int,input().split()))
K.append(Klist[0])
X.append(Klist[1:])
ans2 = set()
for i in range(len(X)):
ans1 = set(list(itertools.combinations(X[i],2)))
ans2 = ans2|ans1
if len(ans)==len(ans2):
print ("Yes")
else:
print ("No")