Cod sursa(job #3188762)

Utilizator Cipy34Harnagea Ciprian Cipy34 Data 3 ianuarie 2024 19:55:59
Problema Taramul Nicaieri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

vector<int> vec[205], vpar; //lista si v de par
int m[205][205], sursa = 0, dest = 204; //matrice de capacitate

int bfs(vector<int> &vpar){
    vpar.assign(205, -1);
    vpar[sursa] = -2;

    queue<pair<int, int>> q;
    q.push({sursa, INT_MAX / 8});

    int nodc, y, nodsucc;
    while(!q.empty()){
        nodc = q.front().first;
        y = q.front().second;
        q.pop();

        for(auto vec2: vec[nodc])
        if(vpar[vec2] == -1 && m[nodc][vec2]){
            vpar[vec2] = nodc;
            nodsucc = min(y, m[nodc][vec2]);

            if(vec2 == dest)
                return nodsucc;

            q.push({vec2, nodsucc});
        }
    }
    return 0;
}

void ad_muchie(int x, int y, int val){ //functie sa adaug muchii in graf
    vec[x].push_back(y);
    vec[y].push_back(x);

    m[x][y] = val;
    m[y][x] = 0;
}

int main()
{
    int N, x, y, rez = 0; //citire date de intrare
    ifstream fin("harta.in");
    fin>>N;

    for(int i = 1; i <= N; i++){
        fin>>x>>y;
        rez += x;
        ad_muchie(sursa, i, x);
        if(i <= 100)
            ad_muchie(i + 100, dest, y);
        else
            ad_muchie(i - 100, dest, y);
    }
    fin.close();

    for(int i = 1; i <= N; i++) //adaug muchii intre orase(formez un graf bipartit complet)
        for(int j = 1; j <= N; j++)
            if(i != j)
                if(i <= 100)
                    ad_muchie(i, j + 100, 1);
                else
                    ad_muchie(i, j - 100, 1);

    int nodc, par, nodsucc;
    nodsucc = bfs(vpar);

    while(nodsucc != 0){ //gasesc fluxul maxim
        nodc = dest;
        while(nodc != sursa){
            par = vpar[nodc];
            m[par][nodc] -= nodsucc;
            m[nodc][par] += nodsucc;
            nodc = vpar[nodc];
        }

        nodsucc = bfs(vpar);
    }

    ofstream fout("harta.out");
    fout<<rez<<"\n";
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
            if(i != j && !m[i][j + 100] && j <= 100)
                fout<<i<<" "<<j<<"\n";
            else if(i != j && !m[i][j - 100] && j > 100)
                fout<<i<<" "<<j<<"\n";
    fout.close();

    return 0;
}