Cod sursa(job #1942775)

Utilizator MithrilBratu Andrei Mithril Data 28 martie 2017 10:48:52
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include<bits/stdc++.h>

using namespace std;

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

#define MAXN  20005
#define FOR(i, a, b)  for (int i = (int)(a); i <= (int)(b); ++ i)

struct Edge {
    int nod,cap,flow;
    Edge(int nod,int cap,int flow) {
        this->nod=nod;
        this->cap=cap;
        this->flow=flow;
    }
};

vector<Edge> adj[MAXN];
bitset<MAXN> vis;
int parent[MAXN];
int n, m, src, sink;

void read_in(void) {
    int cnt_edges, x, y;

    fin>>n>>m>>cnt_edges;
    for (; cnt_edges --; )
    {
        fin>>x>>y;
        adj[x].push_back(Edge(y+n,1,0));
        adj[y+n].push_back(Edge(x,0,0));
    }

    src = 0;
    FOR (i, 1, n) {
        adj[src].push_back(Edge(i,1,0));
        adj[i].push_back(Edge(src,0,0));
    }
    sink = n+m+1;
    FOR (i, n + 1, n + m) {
        adj[i].push_back(Edge(sink,1,0));
        adj[sink].push_back(Edge(i,0,0));
    }
}

bool BFS(int src,int sink) {
    queue<int> q;
    vis.reset();
    q.push(src);
    vis[src]=1;

    for(;q.size();q.pop()) {
        int cNode=q.front();

        for(auto& w:adj[cNode]) {
            int nextN=w.nod;

            if(vis[nextN]||w.cap==w.flow) continue;
            vis[nextN]=1;
            q.push(nextN);
            parent[nextN]=cNode;
            if(nextN==sink) return 1;
        }
    }
    return 0;
}

int main(void)
{
    read_in();
    int cuplaj=0;
    for(;BFS(src,sink);) {

        for(int t=sink;t!=src;t=parent[t]) {

            for(auto& q:adj[t]) {
                if(q.nod!=parent[t]) continue;
                q.flow--;
                break;
            }

            for(auto& q:adj[parent[t]]) {
                if(q.nod!=t) continue;
                q.flow++;
                break;
            }
        }
    }

    FOR(i,1,n) for(auto q:adj[i]){
        if(q.nod==src) continue;
        if(q.flow==1) cuplaj++;
    }
    fout<<cuplaj<<'\n';
    FOR(i,1,n) for(auto q:adj[i]) {
        if(q.nod==src) continue;
        if(q.flow==1) fout<<i<<' '<<q.nod-n<<'\n';
    }
    return 0;
}