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 <stack>
#include <vector>

using namespace std;

void dfs(vector<vector<int>>& g, vector<int>& color, int id, int c) {
    stack<int> s;
    vector<bool> visited(g.size(), false);
    s.push(id);
    color[id] = c;
    while (!s.empty()) {
        int id = s.top();
        s.pop();
        visited[id] = true;

        for (int i = 0; i < g[id].size(); ++i) {
            int adj = g[id][i];
            if (!visited[adj]) {
                color[adj] = c;
                s.push(adj);
            }
        }
    }
}

void assign_colors(vector<vector<int>>& g, vector<int>& color) {
    int color_id = 1;
    for (int i = 0; i < g.size(); ++i) {
        if (color[i] == -1) {
            dfs(g, color, i, color_id);
            ++color_id;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);

    int n, m;
    cin >> n >> m;

    vector<vector<int>> g(n);
    for (int i = 0; i < m; ++i) {
        int p1, p2;
        cin >> p1 >> p2;
        g[p1].push_back(p2);
        g[p2].push_back(p1);
    }

    vector<int> color(n, -1);
    assign_colors(g, color);

    int p;
    cin >> p;
    for (int i = 0; i < p; ++i) {
        int p1, p2;
        cin >> p1 >> p2;
        if (color[p1] == color[p2])
            cout << "yes\n";
        else
            cout << "no\n";
    }
}

C++: #include <iostream>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
using namespace std;

int n;

vector<int> uf;

void initialize(int n)
{
  uf = vector<int>(n);
  for (int i = 0; i < n; i++)
    uf[i] = i;
}

int root(int i)
{
  if (uf[i] == i) return i;
  return uf[i] = root(uf[i]);
}

void unite(int i, int j)
{
  int ri = root(i);
  int rj = root(j);
  if (ri != rj)
    uf[rj] = ri;
}

bool same(int i, int j)
{
  return root(i) == root(j);
}

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

  initialize(n);
  for (int i = 0; i < m; i++) {
    int u, v; cin >> u >> v;
    unite(u, v);
  }

  cin >> q;
  for (int i = 0; i < q; i++) {
    int u, v; cin >> u >> v;
    cout << (same(u, v)?"yes":"no") << endl;
  }

  return EXIT_SUCCESS;
}

C++: #include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <utility>
#include <queue>
#include <stack>
#include <string>
#include <climits>
using namespace std;

#define MAX_N  100000
#define MAX_M  100000
#define MAX_Q  10000

int n, m, q, k, kind[MAX_N] = {};
queue<int> Q;

void bf(vector<vector<int> >& sns, int s)
{
    Q.push(s);
    while (!Q.empty()) {
        s = Q.front();
        Q.pop();
        kind[s] = k;
        for (int i = 0; i < sns[s].size(); i++) {
            if (!kind[sns[s][i]]) Q.push(sns[s][i]);
        }
    }
}

int main()
{
    cin >> n >> m;
    vector<vector<int> > sns(n);
    int s, d;
    while (m--) {
        cin >> s >> d;
        sns.at(s).push_back(d);
        sns.at(d).push_back(s);
    }
    k = 0;
    for (int s = 0; s < n; s++) {
        if (!kind[s]) {
            k++;
            bf(sns, s);
        }
    }
    cin >> q;
    while (q--) {
        cin >> s >> d;
        cout << (kind[s] == kind[d] ? "yes" : "no") << endl;
    }
    return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, start, n) for (int i = (int)(start); i < (int)(n); ++i)
void search(vector<vector<int> > &G, int *color, int s, int id)
{
    color[s] = id; //sは訪問済み
    stack<int> q;
    q.push(s);
    while (q.empty() == false)
    {
        int p = q.top();
        q.pop();
        rep(i, 0, G[p].size())
        {
            int new_p = G[p][i];
            if (color[new_p] == 0)
            {
                color[new_p] = id;
                q.push(new_p);
            }
        }
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int> > G(n, vector<int>(0));
    int color[n] = {};
    int s, t;
    rep(i, 0, m)
    {
        scanf("%d %d", &s, &t);
        G[s].push_back(t);
        G[t].push_back(s);
    }
    int id(0);
    rep(i, 0, n)
    {
        if (color[i] == 0)
        {
            search(G, color, i, ++id);
        }
    }
    int q;
    cin >> q;
    rep(i, 0, q)
    {
        scanf("%d %d", &s, &t);
        if (color[s] == color[t])
            printf("yes\n");
        else
            printf("no\n");
    }
}

C++: #include<iostream>
#include<vector>
#include<stack>
#define MAX 999999
#define NIL -1
using namespace std;


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 assign()
{
  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);
    }

  assign();

  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>
using namespace std;
int main(){
  int n,m,s,t,d[100000];
  vector<int>l[100000];
  cin>>n>>m;
  for(int i=0;i<n;i++)d[i]=-1;
  for(int i=0;i<m;i++){
    cin>>s>>t;
    l[s].push_back(t);
    l[t].push_back(s);
  }
  queue<int> q;
  for(int i=0;i<n;i++){
    if(d[i]==-1){
      q.push(i);
      while(!q.empty()){
	int from=q.front();
	q.pop();
	if(d[from]==-1){
	  d[from]=i;
	  for(int j=0;j<l[from].size();j++)q.push(l[from][j]); 
	}
      }
    }    
  }
  int Q;
  cin>>Q;
  for(int i=0;i<Q;i++){
    cin>>s>>t;
    if(d[s]==d[t])cout<<"yes"<<endl;
    else cout<<"no"<<endl;
  }
  return 0;
}