Language: C++

// 素集合データ構造
struct UnionFind
{
  // par[i]：データiが属する木の親の番号。i == par[i]のとき、データiは木の根ノードである
  vector<int> par;
  // sizes[i]：根ノードiの木に含まれるデータの数。iが根ノードでない場合は無意味な値となる
  vector<int> sizes;

  UnionFind(int n) : par(n), sizes(n, 1) {
    // 最初は全てのデータiがグループiに存在するものとして初期化
    rep(i,n) par[i] = i;
  }

  // データxが属する木の根を得る
  int find(int x) {
    if (x == par[x]) return x;
    return par[x] = find(par[x]);  // 根を張り替えながら再帰的に根ノードを探す
  }

  // 2つのデータx, yが属する木をマージする
  void unite(int x, int y) {
    // データの根ノードを得る
    x = find(x);
    y = find(y);

    // 既に同じ木に属しているならマージしない
    if (x == y) return;

    // xの木がyの木より大きくなるようにする
    if (sizes[x] < sizes[y]) swap(x, y);

    // xがyの親になるように連結する
    par[y] = x;
    sizes[x] += sizes[y];
    // sizes[y] = 0;  // sizes[y]は無意味な値となるので0を入れておいてもよい
  }

  // 2つのデータx, yが属する木が同じならtrueを返す
  bool same(int x, int y) {
    return find(x) == find(y);
  }

  // データxが含まれる木の大きさを返す
  int size(int x) {
    return sizes[find(x)];
  }
};

// 頂点a, bをつなぐコストcostの（無向）辺
struct Edge
{
  int a, b, cost;

  // コストの大小で順序定義
  bool operator<(const Edge& o) const {
    return cost < o.cost;
  }
};

// 頂点数と辺集合の組として定義したグラフ
struct Graph
{
  int n;  // 頂点数
  vector<Edge> es;  // 辺集合

  // クラスカル法で無向最小全域木のコストの和を計算する
  // グラフが非連結のときは最小全域森のコストの和となる
  int kruskal() {
    // コストが小さい順にソート
    sort(es.begin(), es.end());

    UnionFind uf(n);
    int min_cost = 0;

    rep(ei, es.size()) {
      Edge& e = es[ei];
      if (!uf.same(e.a, e.b)) {
        // 辺を追加しても閉路ができないなら、その辺を採用する
        min_cost += e.cost;
        uf.unite(e.a, e.b);
      }
    }

    return min_cost;
  }
};

// 標準入力からグラフを読み込む
Graph input_graph() {
  Graph g;
  int W,H;
  cin >> W >> H;
  g.n=(W+1)*(H+1);
  rep(i, W){
    Edge e;
    cin >> e.cost;
    rep(j,H+1){
      e.a=(W+1)*j;
      e.b=(W+1)*j+1;
      g.es.push_back(e);
    }
  }
  rep(i, H){
    Edge e;
    cin >> e.cost;
    rep(j,W+1){
      e.a=j;
      e.b=j+(H+1);
      g.es.push_back(e);
    }
  }
  return g;
}


int main(){
  Graph g = input_graph();
  cout << g.kruskal() << endl;
  return 0;
}

Compiler output:
a.cc:5:3: error: 'vector' does not name a type
    5 |   vector<int> par;
      |   ^~~~~~
a.cc:7:3: error: 'vector' does not name a type
    7 |   vector<int> sizes;
      |   ^~~~~~
a.cc: In constructor 'UnionFind::UnionFind(int)':
a.cc:9:22: error: class 'UnionFind' does not have any field named 'par'
    9 |   UnionFind(int n) : par(n), sizes(n, 1) {
      |                      ^~~
a.cc:9:30: error: class 'UnionFind' does not have any field named 'sizes'
    9 |   UnionFind(int n) : par(n), sizes(n, 1) {
      |                              ^~~~~
a.cc:11:9: error: 'i' was not declared in this scope
   11 |     rep(i,n) par[i] = i;
      |         ^
a.cc:11:5: error: 'rep' was not declared in this scope
   11 |     rep(i,n) par[i] = i;
      |     ^~~
a.cc: In member function 'int UnionFind::find(int)':
a.cc:16:14: error: 'par' was not declared in this scope
   16 |     if (x == par[x]) return x;
      |              ^~~
a.cc:17:12: error: 'par' was not declared in this scope
   17 |     return par[x] = find(par[x]);  // 根を張り替えながら再帰的に根ノードを探す
      |            ^~~
a.cc: In member function 'void UnionFind::unite(int, int)':
a.cc:30:9: error: 'sizes' was not declared in this scope; did you mean 'size'?
   30 |     if (sizes[x] < sizes[y]) swap(x, y);
      |         ^~~~~
      |         size
a.cc:30:30: error: 'swap' was not declared in this scope
   30 |     if (sizes[x] < sizes[y]) swap(x, y);
      |                              ^~~~
a.cc:33:5: error: 'par' was not declared in this scope
   33 |     par[y] = x;
      |     ^~~
a.cc:34:5: error: 'sizes' was not declared in this scope; did you mean 'size'?
   34 |     sizes[x] += sizes[y];
      |     ^~~~~
      |     size
a.cc: In member function 'int UnionFind::size(int)':
a.cc:45:12: error: 'sizes' was not declared in this scope; did you mean 'size'?
   45 |     return sizes[find(x)];
      |            ^~~~~
      |            size
a.cc: At global scope:
a.cc:64:3: error: 'vector' does not name a type
   64 |   vector<Edge> es;  // 辺集合
      |   ^~~~~~
a.cc: In member function 'int Graph::kruskal()':
a.cc:70:10: error: 'es' was not declared in this scope
   70 |     sort(es.begin(), es.end());
      |          ^~
a.cc:70:5: error: 'sort' was not declared in this scope; did you mean 'short'?
   70 |     sort(es.begin(), es.end());
      |     ^~~~
      |     short
a.cc:75:9: error: 'ei' was not declared in this scope
   75 |     rep(ei, es.size()) {
      |         ^~
a.cc:75:5: error: 'rep' was not declared in this scope
   75 |     rep(ei, es.size()) {
      |     ^~~
a.cc: In function 'Graph input_graph()':
a.cc:92:3: error: 'cin' was not declared in this scope
   92 |   cin >> W >> H;
      |   ^~~
a.cc:94:7: error: 'i' was not declared in this scope
   94 |   rep(i, W){
      |       ^
a.cc:94:3: error: 'rep' was not declared in this scope
   94 |   rep(i, W){
      |   ^~~
a.cc: In function 'int main()':
a.cc:118:3: error: 'cout' was not declared in this scope
  118 |   cout << g.kruskal() << endl;
      |   ^~~~
a.cc:118:26: error: 'endl' was not declared in this scope
  118 |   cout << g.kruskal() << endl;
      |                          ^~~~