import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int M = sc.nextInt(); boolean[][] graph = new boolean[N + 1][N + 1];//邻接边置为true int[] color = new int[N + 1];//未访问0,白色1,黑色-1 for(int i = 0; i < M; ++i){ int a = sc.nextInt(); int b = sc.nextInt(); graph[a][b] = true; graph[b][a] = true; } List<Integer> v = new LinkedList<>();//增删操作比较多(也可以直接用队列) for(int i = 1; i <= N; ++i){ if(color[i] != 0) continue;//涂过色的点已经被之前的连通分量访问了 else color[i] = 1;//给当前连通分量的第1个点涂白色 v.add(i); while(!v.isEmpty()){//广度优先遍历 int p = v.get(0); v.remove(0); for(int j = 1; j <= N; ++j){ if(graph[p][j] && color[j] == 0) {//邻接的点,若未被访问过, v.add(j);//就入队, color[j] = -color[p];//并涂上相反颜色 }else if(graph[p][j] && color[j] == color[p]){//邻接的点同色 System.out.println("No"); return; } } } } System.out.println("Yes"); } }