Cod sursa(job #2670778)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 10 noiembrie 2020 17:50:54
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.97 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int INF = (1<<29);
const int NMAX = 30005;
struct Muchie{
    int a,b;
    int capacitate;
    int flux;
};
int N,n,m,e,x,y;
vector <Muchie> muchii;
vector <vector <int> > v;
vector <int> tata;
int tata2[NMAX];
bool bfs(){
    queue<int> q;
    q.push(0);
    tata.assign(N+1,-1);
    tata[0]=n+m+e;
    while(!q.empty()){
        int node=q.front();
        q.pop();
        if(node==N) continue;
        for(int i:v[node]){
            Muchie edge=muchii[i];
            if(tata[edge.b]!=-1 or edge.capacitate==edge.flux)
                continue;
            tata[edge.b]=i;
            q.push(edge.b);
        }
    }
    return tata[N]!=-1;
}
int main()
{
    fin >> n >> m >> e;
    N=n+m+1;
    muchii.resize(2*N+2*e+5);
    v.resize(N+2,vector<int>());
    for(int i=0;i<2*e;i+=2){
        fin >> x >> y;
        y+=n;
        muchii[i].a=x;
        muchii[i].b=y;
        muchii[i].capacitate=1;
        muchii[i+1].a=muchii[i].b;
        muchii[i+1].b=muchii[i].a;
        v[muchii[i].a].push_back(i);
        v[muchii[i].b].push_back(i+1);
    }
    int ind=2*e;
    for(int i=1;i<=n;i++){
        muchii[ind].a=0;
        muchii[ind].b=i;
        muchii[ind].capacitate=1;
        muchii[ind+1].a=muchii[ind].b;
        muchii[ind+1].b=muchii[ind].a;
        v[muchii[ind].a].push_back(ind);
        v[muchii[ind].b].push_back(ind+1);
        ind+=2;
    }
    for(int i=n+1;i<=n+m;i++){
        muchii[ind].a=i;
        muchii[ind].b=N;
        muchii[ind].capacitate=1;
        muchii[ind+1].a=muchii[ind].b;
        muchii[ind+1].b=muchii[ind].a;
        v[muchii[ind].a].push_back(ind);
        v[muchii[ind].b].push_back(ind+1);
        ind+=2;
    }
    int rasp=0;
    while(bfs()){
        for(int edge_from_dest_index : v[N]){
            int edge_to_dest_index = edge_from_dest_index^1;
            Muchie edge_to_dest = muchii[edge_to_dest_index];
            if(tata[edge_to_dest.a]==-1 or edge_to_dest.flux == edge_to_dest.capacitate)
                continue;
            tata[N]=edge_to_dest_index;
            int minim=INF;
            for(int i=N;i!=0;i=muchii[tata[i]].a)
                minim=min(minim,muchii[tata[i]].capacitate-muchii[tata[i]].flux);
            if(minim==0) continue;
            for(int i=N;i!=0;i=muchii[tata[i]].a){
                muchii[tata[i]].flux+=minim;
                muchii[tata[i]^1].flux-=minim;
                if(muchii[tata[i]].a>muchii[tata[i]].b)
                     tata2[muchii[tata[i]].a]=muchii[tata[i]].b;
                else tata2[muchii[tata[i]].b]=muchii[tata[i]].a;
            }
            rasp+=minim;
        }
    }
    fout << rasp << '\n';
    for(int i=0;i<v[N].size();i++){
        int nod=muchii[v[N][i]].b;
        if(muchii[v[N][i]^1].flux==1){
            fout << tata2[nod] << ' ' << nod-n << '\n';
        }
    }
    return 0;
}