Pagini recente » Cod sursa (job #3189161) | Cod sursa (job #2534767) | Cod sursa (job #2954425) | Cod sursa (job #748719) | Cod sursa (job #547152)
Cod sursa(job #547152)
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;
const char IN[] = {"cc.in"};
const char OUT[] = {"cc.out"};
const int INF = 1000000005;
const double PI = 3.14159265;
const int NMAX = 2 * 101;
#define II inline
#define LL long long
#define PII pair<int, int>
#define PDD pair<double, double>
#define fs first
#define sc second
#define mp make_pair
#define pb push_back
#define FOR(i, a, b) for(int i = a ; i <= b ; i++)
#define IFOR(i, a, b) for(int i = a ; i >= b ; i--)
#define FORIT(it, V) for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)
#define all(a) a, a +
int N;
int cost[NMAX][NMAX], C[NMAX][NMAX], F[NMAX][NMAX];
vector<int> Graf[NMAX];
int in_coada[NMAX], drum[NMAX], tata[NMAX];
int REZ = 0;
void citi()
{
scanf("%d", &N);
FOR(i, 1, N)
FOR(j, 1, N)
{
scanf("%d", &cost[i][N + j]);
cost[N + j][i] = -cost[i][N + j];
C[i][N + j] = 1;
Graf[i].pb(N + j);
Graf[N + j].pb(i);
}
FOR(i, 1, N)
{
C[0][i] = 1;
Graf[0].pb(i);
Graf[i].pb(0);
C[N + i][2 * N + 1] = 1;
Graf[N + i].pb(2 * N + 1);
Graf[2 * N + 1].pb(N + i);
}
}
bool bfs()
{
fill(in_coada, in_coada + NMAX, 0);
fill(drum + 1, drum + NMAX, INF);
fill(tata + 1, tata + NMAX, 0);//nu neaparat
queue<int> Q;
Q.push(0);
in_coada[0] = 1;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
in_coada[x] = 0;
FORIT(it, Graf[x])
if(F[x][*it] < C[x][*it] && drum[x] + cost[x][*it] < drum[*it])
{
drum[*it] = drum[x] + cost[x][*it];
tata[*it] = x;
if(!in_coada[*it])
{
Q.push(*it);
in_coada[*it] = 1;
}
}
}
return drum[2 * N + 1] != INF;
}
int flux()
{
while(bfs())
{
REZ += drum[2 * N + 1];
for(int nod = 2 * N + 1 ; nod ; nod = tata[nod])
{
F[tata[nod]][nod]++;
F[nod][tata[nod]]--;
}
}
return REZ;
}
int main()
{
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
citi();
printf("%d\n", flux());
return 0;
}