Cod sursa(job #2339403)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 8 februarie 2019 20:21:55
Problema Paznici2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
int n, i, j, x, u, sum, srs, dest, nr;
int d[405], viz[405], c[405][405], f[405][405], z[405][405], s[405], t[405];
queue<int> cd;
vector<int> v[405];
ifstream fin("paznici2.in");
ofstream fout("paznici2.out");
int bf(int sr){
    int i, nod, vecin;
    for(i = 0; i <= n + n + 1; i++){
        viz[i] = 0;
        d[i] = 1000000000;
    }
    viz[sr] = 1;
    d[sr] = 0;
    cd.push(sr);
    while(!cd.empty()){
        nod = cd.front();
        cd.pop();
        viz[nod] = 0;
        for(i = 0; i < v[nod].size(); i++){
            vecin = v[nod][i];
            if(d[vecin] > d[nod] + z[nod][vecin] && f[nod][vecin] < c[nod][vecin]){
                d[vecin] = d[nod] + z[nod][vecin];
                t[vecin] = nod;
                if(viz[vecin] == 0){
                    viz[vecin] = 1;
                    cd.push(vecin);
                }
            }
        }
    }
    if(d[dest] == 1000000000){
        return 0;
    }
    return 1;
}
int main(){
    fin>> n;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= n; j++){
            fin>> x;
            c[i][j + n] = 1;
            z[i][j + n] = x;
            z[j + n][i] = -x;
            v[i].push_back(j + n);
            v[j + n].push_back(i);
        }
    }
    srs = 0;
    dest = n + n + 1;
    for(i = 1; i <= n; i++){
        c[srs][i] = 1;
        v[srs].push_back(i);
        v[i].push_back(srs);
        c[i + n][dest] = 1;
        v[i + n].push_back(dest);
        v[dest].push_back(i + n);
    }
    while(bf(srs)){
        sum += d[dest];
        for(u = dest; u != 0; u = t[u]){
            f[ t[u] ][u]++;
            f[u][ t[u] ]--;
        }
    }
    fout<< sum <<"\n";
    for(i = n + 1; i <= n + n; i++){
        bf(i);
        nr = 0;
        for(j = 1; j <= n; j++){
            if(d[j] == z[i][j]){
                s[++nr] = j;
            }
        }
        fout<< nr <<" ";
        for(j = 1; j <= nr; j++){
            fout<< s[j] <<" ";
        }
        fout<<"\n";
    }
    return 0;
}