Cod sursa(job #2962362)

Utilizator Iordache_AnaIordache Ana-Georgiana Iordache_Ana Data 8 ianuarie 2023 14:04:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e, N,i,j,u,v,mini,d,ncur,fluxm,nvec,k;
int viz[20001];
pair<int, int>tata[20001];
vector<vector<pair<pair<int, int>, int>>> l(20001);
int bfs(){
    queue<int> que;
    que.push(0);
    for( i = 0; i <= N; i++){
        tata[i] = {-1, -1};
        viz[i] = 0;
}
    viz[0]++;
    while(que.size()!=0){
        ncur = que.front();
        if(ncur == N)
            return 1;
        k = 0;
        for( i = 0; i < l[ncur].size(); i++){
             nvec = l[ncur][i].first.first;
            if(l[ncur][i].first.second > 0 && viz[nvec] == 0){
                viz[nvec]++;
                tata[nvec] = {ncur, k};
                que.push(nvec);
            }
            k++;
        }
        que.pop();
    }
    return 0;
}
int Edmonds_Karp(){
    fluxm = 0;
    while(bfs()){
        for(i = 0; i < l[N].size(); i++){
            ncur = l[N][i].first.first;
            if(l[ncur][l[N][i].second].first.second > 0 && viz[ncur]){
                mini = 9999999;
                tata[N] = {ncur, l[N][i].second};
                d = N;
               while(tata[d].first!=-1){
                mini = min(mini, l[tata[d].first][tata[d].second].first.second);
                d = tata[d].first;
               }
                fluxm += mini;
                d = N;
                while(tata[d].first!=-1){
                    l[tata[d].first][tata[d].second].first.second -= mini;
                    l[d][l[tata[d].first][tata[d].second].second].first.second += mini;
                    d = tata[d].first;}}}}
    return fluxm;
}
int main()
{
    f>>n>>m>>e;
    N=n+m+1;
    for(i=0;i<e;i++){
        f>>u>>v;
        l[u].push_back({{v+n ,1}, l[v+n].size()});
        l[v+n].push_back({{u, 0}, l[u].size()-1});
    }
    for( i = 1; i <= n; i++){
        l[0].push_back({{i, 1}, l[i].size()});
        l[i].push_back({{0, 0}, l[0].size()-1});
    }
    for( i = 1; i <= m; i++){
        l[i+n].push_back({{N, 1}, l[N].size()});
        l[N].push_back({{i+n, 0}, l[i+n].size()-1});
    }
    g<<Edmonds_Karp()<<"\n";
    for( i = 1; i <= n; i++)
        for( j = 0; j <l[i].size(); j++){
            if(l[i][j].first.second != 1 && l[i][j].first.first != 0)
                g<<i<<" "<<l[i][j].first.first - n<<"\n";
    }
}