给定一个由n个点,m条边组成的无向图(注意,此图可能不连通),对任意1 ≤ i ≤ m存在一条边连接u[i], v[i]。回答此图是不是二分图。二分图定义为存在一种给图中每一个点染上黑白两色其中之一的着色方式,使得对每一对有边直接相连的点颜色不同。
第一行输入为N和M,代表无向图的点数和边数。
接下来M行,表示M条边,每一行两个整数u[i], v[i],满足1 ≤ u[i], v[i] ≤ n,保证图中无重边,自环。
其中保证1 ≤ N, M ≤ 100000
一行字符串,为Yes,或者No。
Yes表示输入图是二分图。
No表示输入图不是二分图。
5 7 1 2 2 3 3 4 4 1 4 5 5 2
Yes
如图,把1, 3, 5点染色为白,2, 4染色为黑,即可满足二分图要求,所以这个图是二分图。
5 4 1 2 2 3 3 1 4 5
No
1, 2, 3号点无论如何染色都无法满足要求,所以不是二分图。
import sys def test_binary(num): dic1 = {} dic2 = {} for i in num: if (i[0] in dic1 and i[1] in dic1) or (i[0] in dic2 and i[1] in dic2): return False else: if i[0] in dic1: dic2[i[1]] = dic2.get(i[1],0)+1 elif i[0] in dic2: dic1[i[1]] = dic1.get(i[1],0)+1 elif i[1] in dic1: dic2[i[0]] = dic2.get(i[0],0)+1 elif i[1] in dic2: dic1[i[0]] = dic1.get(i[0],0)+1 else: dic1[i[0]] = dic1.get(i[0],0)+1 dic2[i[1]] = dic2.get(i[1],0)+1 return True if __name__=='__main__': n,m = list(map(int,input().split())) res = [] for line in sys.stdin.readlines(): temp = list(map(int,line.split())) res.append(temp) if test_binary(res): print('Yes') else: print('No')