Cod sursa(job #1514119)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 30 octombrie 2015 16:51:23
Problema Taramul Nicaieri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#include <queue>
#define DIM 205

using namespace std;

ifstream fin("harta.in");
ofstream fout("harta.out");

int N,M;
int C[DIM][DIM], F[DIM][DIM],T[DIM], minim, flux;
bitset <DIM> inQueue;
vector <int> L[DIM];
queue <int> Q;

int BFS(){
    inQueue.reset();
    int gasit =0;

    Q.push(0);
    inQueue[0]=1;
    while(!Q.empty()){

        int nod = Q.front();
        Q.pop();
        for(int i=0;i<L[nod].size();i++){
            int vec = L[nod][i];
            if(!inQueue[vec] && C[nod][vec] > F[nod][vec]){
                Q.push(vec);
                inQueue[vec]=1;
                T[vec]=nod;
                if(vec == 2*N+1)
                    gasit=1;
            }
        }
    }
    return gasit;
}

int main(){

    fin >> N;
    for(int i=1;i<=N;i++){
        int x,y;
        fin >> x >> y;
        C[0][i] = x;
        L[0].push_back(i);
        L[i].push_back(0);
        C[N+i][2*N+1] = y;
        L[N+i].push_back(2*N+1);
        L[2*N+1].push_back(N+i);
    }

    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            if(i!=j){
                C[i][N+j] = 1;
                L[i].push_back(N+j);
                L[N+j].push_back(i);
            }

    while(BFS()){
        for(int i=0;i<L[2*N+1].size();i++){
            int p = L[2*N+1][i];
            if(C[p][2*N+1] > F[p][2*N+1] && inQueue[p]==1){
                minim = C[p][2*N+1] - F[p][2*N+1];
                int u=p;
                while(u!=0){
                    if(C[T[u]][u] - F[T[u]][u] < minim)
                        minim = C[T[u]][u] - F[T[u]][u];
                    u=T[u];
                }
                flux += minim;

                F[p][2*N+1] += minim;
                F[2*N+1][p] -= minim;

                u=p;
                while(u!=0){
                    F[T[u]][u] += minim;
                    F[u][T[u]] -= minim;
                    u = T[u];
                }
            }
        }
    }

    fout << flux << "\n";
    for(int i=1;i<=N;i++)
        for(int j=N+1;j<=2*N;j++)
            if(F[i][j]==1)
                fout << i << " " << j - N << "\n";
    return 0;
}