Pagini recente » Cod sursa (job #1041476) | Cod sursa (job #432578) | Cod sursa (job #3258995) | Cod sursa (job #2849749) | Cod sursa (job #674911)
Cod sursa(job #674911)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
#define NMAX 220
#define in "cc.in"
#define out "cc.out"
#define inf 1000000
queue<int> Q;
int inQ[NMAX],dist[NMAX],t[NMAX];
int F[NMAX][NMAX],C[NMAX][NMAX],Cost[NMAX][NMAX],N,G[NMAX][NMAX];
ofstream fout(out);
int bf()
{
int i,nod,v;
int li = N + 2;
int ls = 2 * N + 1;
int d = 2 * N + 2;
for(i = 1; i <= d; i++)
{
dist[i] = inf;
inQ[i] = 0;
}
dist[1] = 0;
Q.push(1);
while(!Q.empty())
{
nod = Q.front();
Q.pop();
inQ[nod] = 0;
for(v = 1; v <= G[nod][0]; v++)
{
i = G[nod][v];
if(dist[nod] + Cost[nod][i] < dist[i] && C[nod][i] > F[nod][i])
{
dist[i] = dist[nod] + Cost[nod][i];
t[i] = nod;
if(!inQ[i])
{
inQ[i] = 1;
Q.push(i);
}
}
}
}
int flux = inf;
if(dist[d] != inf)
{
for(i = d; i != 1; i = t[i])
flux = min(C[t[i]][i] - F[t[i]][i],flux);
for(i = d; i != 1; i = t[i])
{
F[t[i]][i] += flux;
F[i][t[i]] -= flux;
}
return flux * dist[d];
}
return 0;
}
int Flux()
{
int ans = 0,tans;
do
{
tans = bf();
ans += tans;
}while(tans);
int i,j;
return ans;
}
int main()
{
ifstream fin(in);
int i,j,c;
fin>>N;
for(i = 2; i <= N + 1; i++)
for(j = 1; j <= N; j++)
{
fin>>Cost[i][j + N + 1];
C[i][j + N + 1] = 1;
C[j + N + 1][i] = 0;
Cost[j + N + 1][i] = -Cost[i][j + N + 1];
G[i][++G[i][0]] = j + N + 1;
G[j + N + 1][++G[j + N + 1][0]] = i;
}
for(i = 2; i <= N + 1; i++)
{
C[1][i] = 1;
G[i][++G[i][0]] = 1;
G[1][++G[1][0]] = i;
}
for(i = N + 2; i <= 2 * N + 1; i++)
{
C[i][2 * N + 2] = 1;
G[i][++G[i][0]] = 2 * N + 2;
}
fout<<Flux()<<'\n';
fin.close();
fout.close();
return 0;
}