Cod sursa(job #1219483)

Utilizator misinozzz zzz misino Data 14 august 2014 12:48:59
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>

#define N 420
#define INF 0x3f3f3f3f

using namespace std;

ifstream f("paznici2.in");
ofstream g("paznici2.out");

int n,i,x,j,dest,cap[N][N],cost[N][N],d[N],viz[N],t[N];

queue<int>q;

vector<pair<int,int> >v[N];
vector<int>sol;

inline bool bf(int sursa, int dest){
    for(int i = 1 ; i <= dest ; ++ i)
        d[i] = INF;

    q.push(sursa);
    viz[sursa] = 1;
    d[sursa] = 0;

    while(!q.empty())
    {
        x = q.front();
        q.pop();
        viz[x] = 0;

        if(x == dest)
            continue;

        for(vector<pair<int,int> >::iterator it = v[x].begin() ; it != v[x].end() ; ++ it)
            if(d[it->first] > d[x] + it->second && cap[x][it->first])
            {
                d[it->first] = d[x] + it->second;
                t[it->first] = x;

                if(!viz[it->first])
                {
                    viz[it->first] = 1;
                    q.push(it->first);
                }
            }
    }

    return d[dest] != INF;
}

inline int fmcm(){

    int cost = 0;
    dest = 2 * n + 1;
    memset(viz,0,sizeof(viz));

    while(bf(0, dest))
    {
        x = dest;

        while(x)
        {
            -- cap[t[x]][x];
            ++ cap[x][t[x]];

            x = t[x];

        }
        cost += d[dest];
    }

    return cost;
}

int main()
{
    f >> n;

    for(i = 1; i <= n; ++i)
    {
        for(j = 1; j <= n; ++j)
        {
            f >> x;

            v[i].push_back(make_pair(j + n, x));
            v[j + n].push_back(make_pair(i, -x));

            cap[i][j + n] = 1;
            cost[i][j + n] = x;
        }

        v[0].push_back(make_pair(i, 0));
        v[i].push_back(make_pair(0, 0));
        cap[0][i] = 1;

        v[i + n].push_back(make_pair(2 * n + 1, 0));
        v[2 * n + 1].push_back(make_pair(i + n, 0));
        cap[i + n][2 * n + 1] = 1;
    }

    g << fmcm() << '\n';

    for(i = n + 1; i <= 2 * n; ++i)
    {
        bf(i,dest);

        sol.clear();

        for(j = 1; j <= n; ++j)
            if(d[j] == - cost[j][i])
                sol.push_back(j);

        g << sol.size() << ' ';

        for(vector<int>::iterator it = sol.begin(); it != sol.end(); ++it)
            g << *it << ' ';

        g << '\n';
    }

    return 0;
}