Language: C++

#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <climits>
#include <cstring>
#include <cassert>
#include <atcoder/maxflow.hpp>


using namespace std;
using namespace atcoder;

#define SZ(x) (int)(x.size())
#define REP(i, n) for(int i=0;i<n;++i)
#define FOR(i, a, b) for(int i=a;i<b;++i)
#define RREP(i, n) for(int i=n-1;i>=0;--i)
#define RFOR(i, a, b) for(int i=b-1;i>=a;--i)

#define all(x) begin(x),end(x)
#define dump(x) cerr<<#x<<" = "<<(x)<<endl
#define debug(x) cerr<<#x<<" = "<<(x)<<" (L"<<__LINE__<<")"<< endl;

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;

template<class T>
bool chmax(T &a, const T &b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
bool chmin(T &a, const T &b) {
    if (b < a) {
        a = b;
        return true;
    }
    return false;
}


template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> p) {
    os << p.first << ":" << p.second;
    return os;
}

template<class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
    os << "[";
    REP(i, SZ(v)) {
        if (i) os << ", ";
        os << v[i];
    }
    return os << "]";
}

template<class T1, class T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp) {
    os << "[";
    for (auto it = mp.begin(); it != mp.end(); ++it) {
        if (it != mp.begin()) {
            os << ", ";
        }
        os << *it;
    }
    return os << "]";
}

// edit
int center(int l, int m, int r) {
    return l <= m && m < r;
}

void solve() {
    int N, M;
    cin >> N >> M;
    vector<string> S(N);
    auto conv = [&](int h, int w) {
        return h * M + w;
    };
    REP(i, N) cin >> S[i];
    mf_graph<int> G(N * M + 2);
    int start = N * M;
    int goal = start + 1;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            if (S[i][j] == '.') {
                if ((i + j) % 2) {
                    G.add_edge(start, conv(i, j), 1);
                    int di[] = {-1, 0, 1, 0};
                    int dj[] = {0, -1, 0, 1};
                    for (int k = 0; k < 4; ++k) {
                        int ni = i + di[k];
                        int nj = j + dj[k];
                        if (center(0, ni, N) && center(0, nj, M)) {
                            int from = conv(i, j);
                            int to = conv(ni, nj);
                            G.add_edge(from, to, 1);
                        }
                    }
                } else {
                    G.add_edge(conv(i, j), goal, 1);
                }
            }
        }
    }

    int sz = G.flow(start, goal);
    auto edges = G.edges();
    for (auto edge : edges) {
        if (edge.flow == 1 && edge.from != start && edge.to != goal) {
            int val1 = edge.from;
            int val2 = edge.to;
            int h1, w1, h2, w2;
            h1 = val1 / M;
            w1 = val1 % M;
            h2 = val2 / M;
            w2 = val2 % M;
            if (h1 == h2) {
                if (w1 > w2) swap(w1, w2);
                S[h1][w1] = '>';
                S[h2][w2] = '<';
            } else {
                if (h1 > h2) swap(h1, h2);
                S[h1][w1] = 'v';
                S[h2][w2] = '^';
            }
        }
    }

    cout << sz << endl;
    for (auto e : S) {
        cout << e << endl;
    }
}


int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
//    std::ifstream in("input.txt");
//    std::cin.rdbuf(in.rdbuf());

    solve();


    return 0;
}


Compiler output:
a.cc:36:10: fatal error: atcoder/maxflow.hpp: No such file or directory
   36 | #include <atcoder/maxflow.hpp>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.