Cod sursa(job #3191418)

Utilizator TL_2022T123 L456 TL_2022 Data 9 ianuarie 2024 18:04:22
Problema Taramul Nicaieri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <utility>
#include <fstream>

int n;
std::vector<std::vector<int>> capacity(202, std::vector<int>(202, 0));
std::vector<std::vector<int>> adj_list(202, std::vector<int>(202, 0));
std::vector<std::pair<int,int>> edge_list;

int bfs(int s, int t, std::vector<int>& parent)
{
    for(size_t i=0; i<parent.size();i++)
        parent[i] = -1;
    parent[s] = -2;
    std::queue<std::pair<int, int>> q;
    q.push({s, INT_MAX});
    while(!q.empty())
    {
        int node = q.front().first;
        int flow = q.front().second;
        q.pop();

        for(int vec = 0; vec < (int)adj_list[node].size(); ++vec)
        {
            if(adj_list[node][vec] && parent[vec] == -1 && capacity[node][vec])
            {
                parent[vec] = node;
                int new_flow = std::min(flow, capacity[node][vec]);
                if(vec == t)
                    return new_flow;
                q.push({vec, new_flow});
            }
        }
    }
    return 0;
}

int maxflow(int s, int t)
{
    int flow = 0;
    std::vector<int> parent(n);
    int new_flow;

    while(new_flow = bfs(s, t, parent))
    {
        flow += new_flow;
        int node = t;
        while(node != s)
        {
            int prev = parent[node];
            capacity[prev][node] -= new_flow;
            capacity[node][prev] += new_flow;
            node = prev;
        }
    }
    return flow;
}

int main()
{
    std::ifstream f("harta.in");
    std::ofstream g("harta.out");

    int nr=0, ind=0, outd=0;
    f >> nr;
    n = 2*nr + 2;
    int s = 0;
    int t = 2 * nr + 1;
    for(int i=1;i<=nr;i++)
        adj_list[s][i] = adj_list[i][s] = 1;
    for(int i=nr+1; i<=2*nr;i++)
        adj_list[i][t] = adj_list[t][i] = 1;
    for(int i=1;i<=nr;i++)
        for(int j=nr+1;j<=2*nr;j++)
            if(i!=j-nr)
            {
                adj_list[i][j] = adj_list[j][i] = 1;
                capacity[i][j] = 1;
            }
    for(int i=1;i<=nr;i++)
    {
        f >> outd >> ind;
        capacity[s][i] = outd;
        capacity[i+nr][t] = ind;
    }

    g << maxflow(s, t)<<"\n";
    for(int i=1;i<=nr;i++)
        for(int j=nr+1;j<=2*nr;j++)
        if(!capacity[i][j] && i!=j-nr)
        g << i << " " << j-nr << "\n";

    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
            std::cout<<adj_list[i][j]<<" ";
        std::cout<<"\n";
    }

    f.close();
    g.close();
    return 0;
}