Pagini recente » Cod sursa (job #670347) | Cod sursa (job #2289816) | Cod sursa (job #2305301) | Cod sursa (job #2940781) | Cod sursa (job #1219483)
#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;
}