aydarbiktimirov icon

Untitled

aydarbiktimirov | PRO | 01/25/12 08:50:23 AM UTC | 0 ⭐ | 300 👁️ | Never ⏰ | []
C++ |

1.72 KB

|

None

|

0 👍

/

0 👎

#include <vector>
#include <iostream>
#include <climits>
 
int main()
{
    int n, m, sum1 = 0, sum2 = 0;
    std::cin >> n >> m;
    std::vector<std::vector<int> > c(n + m + 2, std::vector<int>(n + m + 2, 0));
    for (int i = 0; i < n; ++i)
    {
        int tmp;
        std::cin >> tmp;
        c[0][i + 1] = tmp;
        sum1 += tmp;
        for (int j = 0; j < m; ++j)
        {
            c[i + 1][n + j + 1] = 1;
        }
    }
    for (int j = 0; j < m; ++j)
    {
        int tmp;
        std::cin >> tmp;
        c[n + j + 1][n + m + 1] = tmp;
        sum2 += tmp;
    }
 
    if (sum1 != sum2)
    {
        std::cout << "impossible" << std::endl;
        return 0;
    }
 
    std::vector<std::vector<int> > f(c.size(), std::vector<int>(c.size()));
    for (; ; )
    {
        std::vector<int> from(c.size(), -1);
        std::vector<int> q(c.size());
        int h = 0, t = 0;
        q[t++] = 0;
        from[0] = 0;
        for (int cur; h < t; )
        {
            cur = q[h++];
            for (int v = 0; v < (int)c.size(); ++v)
            {
                if (from[v] == -1 && c[cur][v] - f[cur][v] > 0)
                {
                    q[t++] = v;
                    from[v] = cur;
                }
            }
        }
        if (from[c.size() - 1] == -1)
        {
            break;
        }
        int cf = INT_MAX;
        for (int cur = c.size() - 1; cur != 0; )
        {
            int prev = from[cur];
            cf = std::min(cf, c[prev][cur] - f[prev][cur]);
            cur = prev;
        }
        for (int cur = c.size() - 1; cur != 0; )
        {
            int prev = from[cur];
            f[prev][cur] += cf;
            f[cur][prev] -= cf;
            cur = prev;
        }
    }
 
    int flow = 0;
    for (int i = 0; i < (int)c.size(); ++i)
    {
        if (c[0][i])
        {
            flow += f[0][i];
        }
    }
    if (flow != sum1)
    {
        std::cout << "impossible" << std::endl;
    }
    else
    {
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < m; ++j)
            {
                std::cout << f[i + 1][n + j + 1];
            }
            std::cout << std::endl;
        }
    }
    return 0;
}

Comments