Pagini recente » Cod sursa (job #2083834) | Cod sursa (job #3290761) | Cod sursa (job #2516606) | Cod sursa (job #3281961) | Cod sursa (job #2339403)
#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;
}