Go: package main

import (
	"fmt"
	"os"
	"bufio"
	"strconv"
	"container/list"
	"bytes"
)

const MaxNode int = 1e5

var graph [][] int
var color []int
var N int

func bfs(u, c int) {
	l := list.New()
	l.PushBack(u)
	for ;l.Len()!=0; {
		u = l.Front().Value.(int)
		color[u] = c
		l.Remove(l.Front())
		for i:=0; i<len(graph[u]); i++ {
			if color[graph[u][i]] == 0 {
				l.PushBack(graph[u][i])
			}
		}
	}
}

func assignColor() {
	id := 1
	for u:=0; u<N; u++ {
		if color[u] == 0 {
			bfs(u, id)
			id ++
		}
	}
}

func nextInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	num, _ := strconv.Atoi(scanner.Text())
	return num
}


func buildGraph(scanner *bufio.Scanner) {
	N = nextInt(scanner)
	color = make([]int, N)
	graph = make([][]int, N)
	m := nextInt(scanner)
	for i:=0; i<m; i++ {
		n1 := nextInt(scanner)
		n2 := nextInt(scanner)
		graph[n1] = append(graph[n1], n2)
		graph[n2] = append(graph[n2], n1)
	}
}

func answer(scanner *bufio.Scanner) {
	var outBuffer bytes.Buffer
	cnt := nextInt(scanner)
	for i:=0; i<cnt; i++ {
		n1 := nextInt(scanner)
		n2 := nextInt(scanner)
		if color[n1] == color[n2] {
			outBuffer.WriteString("yes\n")
		} else {
			outBuffer.WriteString("no\n")
		}
	}
	fmt.Printf("%s", outBuffer.String())
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buildGraph(scanner)
	assignColor()
	answer(scanner)
}

Python: n, m = map(int, input().split())

adj = [[] for i in range(n)]

for i in range(m):
    s, t = map(int, input().split())
    adj[s].append(t)
    adj[t].append(s)

isVisited = [False] * n

CC = [None] * n

import sys
sys.setrecursionlimit(10000000000000)

def dfs(u, group):
    isVisited[u] = True
    CC[u] = group
    for v in adj[u]:
        if not isVisited[v]:
            dfs(v, group)

def makeCC(group):
    for i in range(n):
        if not isVisited[i]:
            dfs(i, group)
            group += 1

def isConnected(v1, v2):
    if CC[v1] == CC[v2]:
        print('yes')
    else:
        print('no')


makeCC(0)


q = int(input())

for i in range(q):
    s, t = map(int, input().split())
    isConnected(s, t)

Python: from sys import stdin
n, m = map(int, stdin.readline().split())
G = [-1] * n
def root(x):
    if G[x] < 0: return x
    G[x] = root(G[x])
    return G[x]
def uniteSet(x, y):
    x = root(x)
    y = root(y)
    if x == y : return
    if G[x] > G[y] : x, y = y, x
    G[y] = x
def findSet(x, y): return root(x) == root(y)
for i in range(0, m):
    s, t = map(int, stdin.readline().split())
    uniteSet(s, t)
q = int(stdin.readline())
for i in range(0, q):
    s, t = map(int, stdin.readline().split())
    print("yes" if findSet(s, t) else "no")

Python: #coding: utf-8

n, m = map(int,input().split())
List = [[] for i in range(n)]
colorOriginal = ["white" for i in range(n)]

for i in range(m):
    s,t = map(int,input().split())
    List[s].append(t)
    List[t].append(s)



class DoublyLinkedList():
    def __init__(self, key, l=None, r=None):
        self.l = l
        self.r = r
        self.key = key

def Insert(key,sentinel):
    obj = DoublyLinkedList(key)
    left = sentinel.l
    left.r = obj
    obj.l = left
    obj.r = sentinel
    sentinel.l = obj

def deleteFirst(sentinel):
    right = sentinel.r
    sentinel.r = right.r
    right.r.l = sentinel


def search(a, target):
    sentinel = DoublyLinkedList(None)
    sentinel.l = sentinel
    sentinel.r = sentinel
    
    color = colorOriginal[:]
    Insert(a, sentinel)
    color[a] = "black"
    while sentinel.r.key != None:
        top = sentinel.r.key
        if top == target:
            print("yes")
            break
        for i in List[top]:
            if color[i] == "white":
                Insert(i, sentinel)
                color[i] = "gray"
        color[top] = "black"
        deleteFirst(sentinel)
    else:
        print("no")

ques = int(input())
for i in range(ques):
    a, target = map(int,input().split())
    search(a, target)

Python: from collections import deque

def bfs(graph, start, goal):
    visited = {start: None}
    unvisited = deque()
    unvisited.append(start)
    while unvisited:
        now = unvisited.popleft()
        if now == goal or goal in graph[now]:
            graph[start].add(goal)
            graph[goal].add(start)
            return "yes"
        for next in graph[now]:
            if not (next in visited):
                unvisited.append(next)
                visited[next] = now
    return "no"

n, m = map(int, input().split())
g = [set() for i in range(n)]

for i in range(m):
    a, b = map(int, input().split())
    g[a].add(b)
    g[b].add(a)

q = int(input())

for i in range(q):
    s, t = map(int, input().split())
    print(bfs(g, s, t))

Python: import sys
sys.setrecursionlimit(1000000)
n, m = map(int, input().split())
graph = [[] for _ in range(n)]

global visited 
visited = [0 for _ in range(n)]

def input_graph(m):
  for _ in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)

def dfs(node_id):
  
  for ad_node in graph[node_id]:
    if visited[ad_node] == 1:
      continue
    visited[ad_node] = 1
    dfs(ad_node)

if __name__ == "__main__":
  input_graph(m)
  q_num = int(input())
  for _ in range(q_num):
    visited = [0 for _ in range(n)]
    s, t = map(int, input().split())
    dfs(s)
    if visited[t]:
      print("yes")
    else:
      print("no")

Python: #!/usr/bin/python3
n, m = map(int, input().split())

e = [None] * n

for i in range(m):
    s, t = map(int, input().split())
    if e[s] == None and e[t] == None:
        a = {s, t}
        e[s] = e[t] = a
    elif e[s] == None:
        e[t].add(s)
        e[s] = e[t]
    elif e[t] == None:
        e[s].add(t)
        e[t] = e[s]
    else:
        a = e[s] | e[t]
        for j in a:
            e[j] = a

q = int(input())
for i in range(q):
    s, t = map(int, input().split())
    if t in e[s]:
        print('yes')
    else:
        print('no')

Python: from collections import deque
n,m = [int(i) for i in input().split()]
F = [{} for i in range(n)]
for _ in range(m):
    i,j = [int(i) for i in input().split()]
    F[i][j] = 1
    F[j][i] = 1
q = int(input())
for i in range(q):
    DP = [0]*n
    d = deque()
    s,t = [int(i) for i in input().split()]
    d.append(s)
    flag = False
    while(len(d)>0):
        tmp = d.pop()
        DP[tmp] = 1
        if tmp == t:
            flag = True
            break
        else:
            for i in F[tmp]:
                if not DP[i]:
                    d.append(i)
    if flag:
        print("yes")
    else:
        print("no")

Python: import collections
import sys
sys.setrecursionlimit(100000)

n, m = [int(ele) for ele in input().split()]
graph = [[i] for i in range(n)]
grps = [-1] * n
s = [-1] * (m+1)
t = [-1] * (m+1)

for _ in range(m):
    k, l = [int(ele) for ele in input().split()]
    graph[k].append(l)
    graph[l].append(k)

q = int(input())

s_q = [-1] * (q)
s_t = [-1] * (q)

for i in range(q):
    s_q[i], s_t[i] = [int(ele) for ele in input().split()]


yet = [ele for ele in range(n)]
stack = collections.deque()


def main():
    global graph, grps
    grouping()

    for src, dst in zip(s_q, s_t):
        if grps[src] == grps[dst]:
            print("yes")
        else:
            print("no")


def grouping():
    global yet, stack, grps, tmp
    tmp = 97
    while yet:
        stack.clear()
        stack.appendleft(yet[0])  # 常にmin(yet) = yet[0]
        dfs(stack)
        tmp += 1


def dfs(stack):
    global yet, graph, grps, tmp
    if not stack:
        return

    n = stack[0]
    grps[n] = chr(tmp)
    yet.remove(n)

    for ele in graph[n][1:]:
        if ele in yet:  # 未訪問なら
            stack.appendleft(ele)
            dfs(stack)
    else:
        stack.popleft()


if __name__ == "__main__":
    main()