Cod sursa(job #1327836)

Utilizator sebinechitasebi nechita sebinechita Data 27 ianuarie 2015 10:48:42
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
#define MAX 203
#define INF (1<<30)

typedef vector<int> :: iterator iter;
vector<int> G[MAX];
queue <int> Q;
int C[MAX][MAX], Ca[MAX][MAX], F[MAX][MAX];
int dad[MAX], n, dist[MAX], maxflow;
bool bfs()
{
    int i;
    dad[0] = -1;
    for(i = 1 ; i <= 2 * n + 1; i++)
    {
        dist[i] = INF;
        dad[i] = -1;
    }
    Q.push(0);
    while(Q.size())
    {
        int nod = Q.front();
        Q.pop();

        for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
        {
            if(F[nod][*it] < Ca[nod][*it] && dist[nod] + C[nod][*it] < dist[*it])
            {
                Q.push(*it);
                dist[*it] = dist[nod] + C[nod][*it];
                dad[*it] = nod;
            }
        }
    }
    if(dad[2 * n + 1] == -1)
        return 0;
    int s = 0;
    int flow = INF;
    for(i = 2 * n + 1 ; i ; i = dad[i])
    {
        flow = min(flow, Ca[dad[i]][i] - F[dad[i]][i]);
    }
    for(i = 2 * n + 1 ; i ; i = dad[i])
    {
        F[dad[i]][i] += flow;
        F[i][dad[i]] -= flow;
        s += flow * C[dad[i]][i];
    }
    maxflow += s;

    return 1;
}

int main()
{
    int i, j;
    fin >> n;
    for(i = 1 ; i <= n ; i++)
    {
        for(j = 1 ; j <= n ; j++)
        {
            G[i].push_back(j + n);
            G[j + n].push_back(i);
            fin >> C[i][j + n];
            C[j + n][i] = -C[i][j + n];
            Ca[i][j + n] = 1;
        }
        G[0].push_back(i);
        G[i].push_back(0);
        G[i + n].push_back(2 * n + 1);
        G[2 * n + 1].push_back(i + n);
        Ca[0][i] = 1;
        Ca[i + n][2 * n + 1] = 1;
    }

    while(bfs());

    fout << maxflow << "\n";

    return 0;
}