Go: package main

import (
	"fmt"
)

var n, m int
var g [][]int
var color []int

func main() {
	fmt.Scan(&n, &m)
	g = make([][]int, n) // SNSの関係を表すグラフ
	for i := 0; i < m; i++ {
		var a, b int
		fmt.Scan(&a, &b)
		g[a] = append(g[a], b) // 無向重みなしグラフ
		g[b] = append(g[b], a)
	}
	color = make([]int, n) // 各ノードにつける色
	for i := 0; i < len(color); i++ {
		color[i] = -1 // 初期化しておく
	}
	type query struct {
		s, t int
	}
	var Q int
	fmt.Scan(&Q)
	qs := make([]query, Q)
	for i := 0; i < Q; i++ {
		fmt.Scan(&qs[i].s, &qs[i].t)
	}
	// fmt.Println("n", n, "m", m, "g", g, "Q", Q, "qs", qs)
	// 全ての頂点からdfsする
	id := 1
	for u := 0; u < n; u++ {
		if color[u] == -1 {
			dfs(u, id)
			id++
		}
	}
	// fmt.Println("color", color)
	for i := 0; i < Q; i++ {
		if color[qs[i].s] == color[qs[i].t] {
			fmt.Println("yes")
		} else {
			fmt.Println("no")
		}
	}
}

func dfs(v, c int) {
	// fmt.Printf("dfs(v %d, c %d) en:\n", v, c)
	color[v] = c
	for _, vv := range g[v] {
		// fmt.Printf("  v %d, g[v] %v, vv %d\n", v, g[v], vv)
		if color[vv] == -1 {
			dfs(vv, c)
		}
	}
}

C++: #include<iostream>
#include<vector>
#include<stack>
using namespace std;
static const int MAX = 100000;
static const int NIL = -1;
 
int n;
vector<int>G[MAX];
int color[MAX];
 
void dfs(int r, int c) {
    stack<int>S;
    S.push(r);
    color[r] = c;
    while (!S.empty()) {
        int u = S.top(); S.pop();
        for (int i = 0; i < G[u].size(); i++) {
            int v = G[u][i];
            if (color[v] == NIL) {
                color[v] = c;
                S.push(v);
            }
        }
    }
}
 
void assignColor() {
    int id = 1;
    for (int i = 0; i < n; i++)color[i] = NIL;
    for (int u = 0; u < n; u++) {
        if (color[u] == NIL)dfs(u, id++);
    }
}
int main() {
    int s, t, m, q;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        cin >> s >> t;
        G[s].push_back(t);
        G[t].push_back(s);
    }
    assignColor();
    cin >> q;
    for (int i = 0; i < q; i++) {
        cin >> s >> t;
        if (color[s] == color[t]) {
            cout << "yes" << endl;
        }
        else {
            cout << "no" << endl;
        }
    }
    return 0;
}

C++: #include <bits/stdc++.h>
#define REP(i, n) for (int (i) = 0; (i) < (int)(n); i++) 
#define FOR(i, a, b) for(int (i) = a; (i) < (int)b; i++)
#define RREP(i, n) for(int (i)=((int)(n)-1); (i)>=0; i--)
#define RFOR(i, a, b) for(int (i) =((int)(b)-1); (i)>=(int)a; i--)
#define ALL(v) (v).begin(),(v).end()
#define MOD 1000000007
#define NIL -1
#define FI first
#define SE second
#define MP make_pair
#define PB push_back
#define SZ(x)  (int)x.size()
#define SP(x)  setprecision((int)x)


using namespace std ;
typedef long long ll;
using Graph = vector<vector<int>>;
typedef vector<int> vint;
typedef vector<vint> vvint;
typedef vector<string> vstr;
typedef pair<int, int> pii;
const int INF = 1e9;
const ll LINF = 1e18;
const double EPS = 1e-9;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} //最大公約数
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} //最小公倍数

//-------------------------------------------------
// 
void yes(){
  cout <<"yes"<<endl ;
}
void no(){
  cout <<"no"<<endl ;
}


//-------------------------------------------------
// メモ
/*






*/
//-------------------------------------------------


int main()
{
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, m ;
  cin >> n >> m ;
  vint seen(n,0) ;
  vector<queue<int>> gra(n) ;
  stack<int> S ;
  REP(i,m){
    int a, b ;
    cin >>a >> b ;
    gra[a].push(b) ;
    gra[b].push(a) ;
  }
  
  int cnt = 1 ;
  vint num(n,0) ;
  
  S.push(0) ;
  seen[0] = 1 ;
  num[0] = cnt ;
  
  while(!S.empty()){
    int k = S.top() ;
    
    while(1){
      if(gra[k].empty()){
        S.pop() ;
        break ;
      }
      int l = gra[k].front() ;
      if(seen[l]==1){
        gra[k].pop() ;
        continue ;
      }
      else{
        S.push(l) ;
        gra[k].pop() ;
        seen[l] = 1 ;
        num[l] = num[k] ;
        break ;
      }
    }
    
    if(S.empty()){
      REP(i,n){
        if(seen[i]==0){
          S.push(i) ;
          seen[i] = 1 ;
          cnt++ ;
          num[i] = cnt ;
          break ;
        }
      }
    }
  }
  
  int q ;
  cin >> q ;
  REP(i,q){
    int x, y ;
    cin >> x >> y ;
    if(num[x]==num[y]){
      yes() ;
    }
    else{
      no() ;
    }
  }
  
  

  return 0 ;
}

C++: #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m, s, t, u;
vector<vector <int> > a;
bool f[100000];

bool path(int s1) {
	f[s1] = 1;
	for (int i = 0; i < (int) a[s1].size(); i++) {
		if (a[s1][i] == t) {
			a[s].push_back(t);
			return true;
		}
		else if (!f[a[s1][i]])
			if (path(a[s1][i]))
				return true;
	}
	return false;
}

int main()
{
	cin >> n >> m;

	a.resize(n);

	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;
		a[u].push_back(v);
		a[v].push_back(u);
	}

	for (int i = 0; i < n; i++)
		sort(a[i].begin(), a[i].end());

	int q;
	cin >> q;
	for (int i = 0; i < q; i++) {
		cin >> s >> t;

	for (int i = 0; i < n; i++)
		f[i] = 0;

		if(path(s))
			cout << "yes" << endl;
		else
			cout << "no" << endl;
	}

	return 0;
}

C++: #include<iostream>
#include<queue>
#include<stack>
#include<vector>

using namespace std;

int main(){
	int n,m;
	cin >> n >> m;
	
	vector<int> es[n];
	int s,t;
	for(int i=0;i<m;i++){
		cin >> s >> t;
		es[s].push_back(t);
		es[t].push_back(s);
	}
	int q;
	cin >> q;
	for(int i=0;i<q;i++){
		cin >> s >> t;
		
		bool used[n];
		fill(used,used+n,0);
		bool flag = false;
		stack<int> stk;
		stk.push(s);
		used[s] = true;
		while(!stk.empty()){
			int v = stk.top(); stk.pop();
			for(int j=0;j<es[v].size();j++){
				int next = es[v][j];
				if(next == t){
					cout << "yes\n";
					flag = true;
					break;
				}
				if(!used[next]){
					stk.push(next);
					used[next] = true;
				}
			}
			if(flag){
				break;
			}
		}
		if(!flag){
			cout << "no\n";			
		}
	}
	return 0;
}