Go: // AOJ ALDS1_11_D: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_11_D

package main

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

var nocolor = -1

type graph struct {
	graph  [][]int
	colors []int
}

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

func newGraph(nodeNum int) *graph {
	colors := make([]int, nodeNum)
	g := make([][]int, nodeNum)
	for i := 0; i < nodeNum; i++ {
		g[i] = []int{}
		colors[i] = nocolor
	}

	return &graph{g, colors}
}

func constructGraph(sc *bufio.Scanner) *graph {
	usersNum := nextInt(sc)
	linkNum := nextInt(sc)

	g := newGraph(usersNum)
	for i := 0; i < linkNum; i++ {
		u := nextInt(sc) // node
		l := nextInt(sc) // link node
		// edge each other
		g.graph[u] = append(g.graph[u], l)
		g.graph[l] = append(g.graph[l], u)
	}
	return g
}

func (g *graph) dfs(r, color int) {
	g.colors[r] = color

	stack := list.New()
	stack.PushFront(r)

	for stack.Len() > 0 {
		v := stack.Remove(stack.Front()).(int)
		for _, u := range g.graph[v] {
			if g.colors[u] == nocolor {
				g.colors[u] = color
				stack.PushFront(u)
			}
		}
	}
}

func (g *graph) assignColor() {
	color := 1
	for u := 0; u < len(g.graph); u++ {
		if g.colors[u] == nocolor {
			g.dfs(u, color)
			color++
		}
	}
}

func (g *graph) isLink(s, t int) bool {
	return g.colors[s] == g.colors[t]
}

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)

	// construct graph and friendly colors
	g := constructGraph(sc)
	g.assignColor()

	// judge link
	q := nextInt(sc)
	for i := 0; i < q; i++ {
		s := nextInt(sc)
		t := nextInt(sc)

		if g.isLink(s, t) {
			fmt.Println("yes")
		} else {
			fmt.Println("no")
		}
	}
}

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;
}