Pagini recente » Cod sursa (job #863151) | Cod sursa (job #275180) | Cod sursa (job #2427091) | Cod sursa (job #1812685) | Cod sursa (job #852506)
Cod sursa(job #852506)
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;
#define LL long long
#define II inline
#define pb push_back
#define fs first
#define ss second
#define all(c) c, c+GMAX
#define FORIT(it, v) for(it = v.begin() ; it != v.end() ; it++)
const int INF = 1000000005;
const int NMAX = 205;
const int GMAX = 2*NMAX + 2;
int N, S, D, REZ;
int cost[GMAX][GMAX];
vector<int> G[GMAX];
int F[GMAX][GMAX], C[GMAX][GMAX];
int dist[GMAX], tata[GMAX];
void citi()
{
scanf("%d", &N);
S = 0;
D = 2*N + 1;
for(int i = 1 ; i <= N ; i++)
for(int j = N + 1; j <= 2 * N ; j++)
{
scanf("%d", &cost[i][j]);
cost[j][i] = -cost[i][j];
G[i].push_back(j);
G[j].push_back(i);
C[i][j] = 1;
}
for(int i = 1 ; i <= N ; i++)
{
G[i].push_back(S);
G[S].push_back(i);
C[S][i] = 1;
}
for(int j = N + 1; j <= 2 * N ; j++)
{
G[D].push_back(j);
G[j].push_back(D);
C[j][D] = 1;
}
}
int BFS(int sursa)
{
vector<int> :: iterator it;
queue<int> Q;
fill(all(dist), INF);
fill(all(tata), 0);
dist[sursa] = 0;
Q.push(sursa);
while(!Q.empty())
{
int x = Q.front();
Q.pop();
FORIT(it, G[x])
if(F[x][*it] < C[x][*it] && dist[*it] > dist[x] + cost[x][*it])
{
dist[*it] = dist[x] + cost[x][*it];
tata[*it] = x;
Q.push(*it);
}
}
return dist[D] != INF;
}
void flux()
{
while(BFS(S))
{
for(int nod = D ; nod != S ; nod = tata[nod])
{
F[tata[nod]][nod]++, F[nod][tata[nod]]--;
REZ += cost[tata[nod]][nod];
}
}
}
void scrie()
{
printf("%d\n", REZ);
for(int j = N + 1 ; j <= 2 * N ; j++)
{
BFS(j);
int sol[NMAX] = {0};
for(int i = 1 ; i <= N ; i++)
if(cost[i][j] + dist[i] == 0)
sol[++sol[0]] = i;
for(int k = 0 ; k <= sol[0] ; k++)
printf("%d ", sol[k]);
printf("\n");
}
}
int main()
{
freopen("paznici2.in", "r", stdin);
freopen("paznici2.out", "w", stdout);
citi();
flux();
scrie();
return 0;
}