Go: package main

import (
	"fmt"
	"bufio"
	"os"
	"strconv"
)

func main() {
	var n,m int
	fmt.Scan(&n)
	group := make([]int, n)
	g := make([][]int, n)
	for i := 0; i < n; i++ {
		g[i] = []int{}
		group[i] = -1
	}
	
	fmt.Scan(&m)
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)
	for i := 0; i < m; i++ {
		sc.Scan()
		s, _ := strconv.Atoi(sc.Text())
		sc.Scan()
		t, _ := strconv.Atoi(sc.Text())
		
		g[s] = append(g[s], t)
		g[t] = append(g[t], s)
	}
	for i := 0; i < n; i++ {
		if group[i] != -1 {
			continue
		}
		q := []int{i}
		for len(q) > 0 {
			pop := q[0]
			if len(q) > 1 {
				q = q[1:]
			} else {
				q = []int{}
			}
			if group[pop] == -1 {
				q = append(q, g[pop]...)
				group[pop] = i
			}
		}
	}
	sc.Scan()
	q, _ := strconv.Atoi(sc.Text())
	for i := 0; i < q; i++ {
		sc.Scan()
		s, _ := strconv.Atoi(sc.Text())
		sc.Scan()
		t, _ := strconv.Atoi(sc.Text())

		if group[s] == group[t] {
			fmt.Println("yes")
		} else {
			fmt.Println("no")
		}
	}
}

func root(i int, group *[]int) int {
	if i == (*group)[i] {
		return i
	}
	(*group)[i] = root((*group)[i], group)
	return (*group)[i]
}

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()

Python: # -*- coding: utf-8 -*-
from collections import deque


if __name__ == '__main__':

    n, m = [int(s) for s in input().split(" ")]
    M = [[] for j in range(n)]
    for _ in range(m):
        u, v = [int(s) for s in input().split(" ")]
        M[u].append(v)
        M[v].append(u)
        
    color = [0] * n
    def dfs(u, c):  # depth-first search
        color[u] = c
        for v in range(n):
            if v in M[u] and color[v] == 0:
                dfs(v, c)
        color[u] = c
    
    c = 1
    for u in range(n):
        if color[u] == 0:
            dfs(u, c)
            c += 1
    
    l = int(input())
    for _ in range(l):
        p, q = [int(s) for s in input().split(" ")]
        if color[p] == color[q]:
            print("yes")
        else:
            print("no")