func_code_string: #include <bits/stdc++.h>   using namespace std;   struct edge {     int to, cap, cost, rev, id;   };   int dist[5005], h[5005], prevv[5005], preve[5005];   int V, n, m;   vector<edge> G[5005];   void add_edge(int from, int to, int cap, int cost) {     G[from].push_back((edge){to, cap, cost, (int)G[to].size()});     G[to].push_back((edge){from, 0, -cost, (int)G[from].size() - 1});   }   int min_cost_flow(int s, int t, int f) {     int res = 0;     fill(h + 1, h + V + 1, 0);     while (f > 0) {       priority_queue<pair<int, int>, vector<pair<int, int> >,                      greater<pair<int, int> > >           que;       fill(dist + 1, dist + V + 1, 1000000000);       dist[s] = 0;       que.push(pair<int, int>(0, s));       while (!que.empty()) {         pair<int, int> p = que.top();         que.pop();         int v = p.second;         if (dist[v] < p.first) continue;         for (int i = 0; i < G[v].size(); i++) {           edge &e = G[v][i];           if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {             dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];             prevv[e.to] = v;             preve[e.to] = i;             que.push(pair<int, int>(dist[e.to], e.to));           }         }       }       if (dist[t] == 1000000000) {         return -1;       }       for (int v = 1; v <= V; v++) h[v] += dist[v];       int d = f;       for (int v = t; v != s; v = prevv[v]) {         d = min(d, G[prevv[v]][preve[v]].cap);       }       f -= d;       res += d * h[t];       for (int v = t; v != s; v = prevv[v]) {         edge &e = G[prevv[v]][preve[v]];         e.cap -= d;         G[v][e.rev].cap += d;       }     }     return res;   }   int w[5005][5005];   int ans[5005][5005];   int main() {     scanf( %d%d , &n, &m);     for (int i = 0; i < m; i++) {       int u, v;       scanf( %d%d , &u, &v);       w[u][v] = 1;     }     int s = n + n * (n - 1) / 2 + 1, t = s + 1;     V = t;     int tot = 0;     for (int i = 1; i <= n; i++)       for (int j = i + 1; j <= n; j++) {         tot++;         add_edge(s, tot + n, 1, 0);         if (!w[i][j]) add_edge(tot + n, i, 1, 0);         if (!w[j][i]) add_edge(tot + n, j, 1, 0);       }     for (int i = 1; i <= n; i++)       for (int j = 1; j <= n - 1; j++) add_edge(i, t, 1, 2 * j - 1);     int res = min_cost_flow(s, t, n * (n - 1) / 2);     tot = 0;     for (int i = 1; i <= n; i++)       for (int j = i + 1; j <= n; j++) {         tot++;         for (auto e : G[n + tot]) {           if (e.cap) continue;           if (e.to == i)             w[j][i] = 1;           else             w[i][j] = 1;         }       }     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) printf( %d , w[i][j]);       puts(  );     }     return 0;   }   