Cod sursa(job #867594)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 29 ianuarie 2013 21:17:59
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>

#define MAX 205
#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define PII pair<int, int>

using namespace std;

int N, rez, S, D;
int dist[MAX], dad[MAX];
bool inQueue[MAX];
PII cf[MAX][MAX];
vector<PII> V[MAX];
queue<int> Q;

int BellmanFord()
{
    memset(dist, INF, sizeof(dist));
    memset(inQueue, 0, sizeof(inQueue));
    memset(dad, 0, sizeof(dad));
    dist[S] = 0; Q.push(0); inQueue[S] = true;
    while(!Q.empty())
    {
        int nod = Q.front(); Q.pop(); inQueue[nod] = false;
        for(size_t i = 0; i < V[nod].size(); i++)
        {
            int dest = V[nod][i].f, cost = V[nod][i].s;
            if(cf[nod][dest].f != cf[nod][dest].s && dist[dest] > dist[nod] + cost)
            {
                dist[dest] = dist[nod] + cost;
                dad[dest] = nod;
                if(!inQueue[dest])
                    inQueue[dest] = true, Q.push(dest);
            }
        }
    }
    if(dist[D] != INF)
    {
        int nod = D;
        while(nod)
        {
            cf[dad[nod]][nod].s++;
            cf[nod][dad[nod]].s--;
            nod = dad[nod];
        }
        return dist[D];
    }
    return 0;
}

int cuplaj()
{
    int X = 0;
    for(int i = 1; i <= N; i++)
        X += BellmanFord();
    return X;
}

int main()
{
    ifstream in("cc.in");
    in>>N;
    for(int i = 1; i <= N; i++)
        for(int j = 1, C, dest; j <= N; j++)
        {
            in>>C;
            dest = j + N;
            V[i].pb(mp(dest, C)); V[dest].pb(mp(i, -C));
            cf[i][dest] = mp(1, 0); cf[dest][i] = mp(0, 0);
        }
    S = 0, D = 2 * N + 1;
    for(int i = 1; i <= N; i++)
    {
        V[S].pb(mp(i, 0)); V[i].pb(mp(S, 0));
        cf[S][i] = mp(1, 0); cf[i][S] = mp(0, 0);
    }
    for(int i = N + 1; i <= 2 * N; i++)
    {
        V[i].pb(mp(D, 0)); V[D].pb(mp(i, 0));
        cf[i][D] = mp(1, 0); cf[D][i] = mp(0, 0);
    }
    rez = cuplaj();
    ofstream out("cc.out"); out<<rez<<"\n"; out.close();
    return 0;
}